2014-10-17 5 views
1

Мне нужно сгенерировать уникальные идентификаторы, длина которых не должна превышать 5, из-за этого числа не подходят, он каким-либо образом генерирует уникальные строки в базе данных оракула?Как генерировать последовательность строк оракула?

+0

Сколько значений нужно учесть? Используя обычную последовательность, но сохраняя шестнадцатеричный эквивалент, вы получите от 100 000 значений до 1 048 756, но это все еще может быть слишком низким? Использование 26 символов даст 11 881 376 возможных значений; включая цифры, даст 60 466 176. Но сложнее преобразование последовательности. –

+0

почему ограничение на 5? (изменение схемы будет иметь больше смысла imo).Кроме того, даже если вы придерживаетесь ограничения 5, сколько уникальных значений вам нужно? Вероятно, лучше всего изменить схему и использовать либо число, либо sys_guid. – tbone

+0

Lemetation on 5 из-за документации от клиента для готового отдыха api, мне нужно более десяти миллиардов объектов. –

ответ

0

Это может помочь: http://www.deep-data-mining.com/2012/06/five-ways-of-creating-unique-record.html

Этот бит выглядит полезным:

Согласно документу Oracle, SYS_GUID генерирует и возвращает глобально уникальный идентификатор (необработанное значение) из 16 байтов.

Например, в нашей системе Oracle, я могу это сделать:

select sys_guid() uniq_id from dual; 

И получить это:

059D828192804EABE05400144FFB6CA7 

В следующий раз я получаю:

059D828192A34EABE05400144FFB6CA7 

Некоторые из числа увеличиваются каждый раз.

я мог бы ограничить, что 5 символов, в том числе битов строки, которые изменяются каждый раз, когда он работает:

select substr(sys_guid(),9,5) uniq_id from dual; 

Чтобы получить, например,

92D14 
+3

Как я вижу, вы просто вырезали сгенерированную строку, и она не может быть уникальной. –

+0

Да, извините, я думаю, что мой ответ был, вероятно, грузом старого мусора: - \ Извините. Я думал, что номер будет уникальным, но, возможно, это будет не так, я не уверен. Извините за то, что потратил время. –

2

Вы можете попробовать использовать Base 36: http://en.wikipedia.org/wiki/Base_36

SQL: Base 36 to Base 10 conversion using SQL only

Благодаря комментарии к этому ответу, я добавляю пример:

Эта функция преобразует базу 10 к базе, которая состоит из букв.

create or replace 
function basen(n10 in number, letters in varchar2) return varchar2 as 
    s  varchar2(1000); 
    len  number := length(letters); 
    base10 number := n10; 
begin 
    if len <= 0 then 
    return null; 
    end if; 

    loop 
    if base10 < len then 
     return substr(letters, base10+1, 1) || s; 
    end if; 
    s := substr(letters, mod(base10, len)+1,1) || s; 
    base10 := floor(base10/len); 
    end loop; 

    return s; 
end baseN; 

Эта функция преобразует base10 в base36:

create or replace function base36(n10 in number) return varchar2 as 
begin 
    return basen(n10, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'); 
end base36; 

Вы можете создать общую последовательность с соответствующей MINVALUE и MAXVALUE и использовать один из указанных выше способов в триггере, SQL и т.д.

2

Этот метод использует числа в формате HEX.

select to_char(seq.nextval, 'fm0XXXX') 
    from dual; 

Или это более компактный способ использовать все символы между ASCII код 33 и 122:

select num, 
     chr(33 + mod(floor(num/(90*90*90*90)), 90))|| 
     chr(33 + mod(floor(num/(90*90*90)), 90))|| 
     chr(33 + mod(floor(num/(90*90)),90))|| 
     chr(33 + mod(floor(num/90),90))|| 
     chr(33 + mod(num,90)) as x00000 
from (select seq.nextval as num 
     from dual); 

В основном это представление числа 90 на основе.

Смежные вопросы