Oracle'da bir GUID nasıl oluşturulur?


93

Bir GUID'yi bir Insert deyimine otomatik olarak oluşturmak mümkün müdür?

Ayrıca, bu GUID'yi depolamak için ne tür bir alan kullanmalıyım?

Yanıtlar:


141

İnsert deyiminizde bir GUID oluşturmak için SYS_GUID () işlevini kullanabilirsiniz:

insert into mytable (guid_col, data) values (sys_guid(), 'xxx');

GUID'leri depolamak için tercih edilen veri türü RAW'dır (16).

Gopinath'ın cevabı olarak:

 select sys_guid() from dual
 union all
 select sys_guid() from dual
 union all 
 select sys_guid() from dual

Sen alırsın

88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601

Tony Andrews'un dediği gibi, yalnızca bir karakterde farklılık gösterir

88FDC68C75D D F955E040449808B55601
88FDC68C75D E F955E040449808B55601
88FDC68C75D F F F955E040449808B55601

Belki yararlı olabilir: http://feueringlyts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html


Garip, sys_guid () bana her zaman aynı GUID'yi veriyor .. İşleve bir tohum vermem gerekiyor mu yoksa?
Acibi

11
Tamamen aynı olduklarından emin misin? Çok benzer (ancak farklı) değerler döndürme eğilimindedir - örneğin, yeni denediğimde 88FDC68C75DEF955E040449808B55601 ve 88FDC68C75DFF955E040449808B55601 aldım, bu sadece 12. karakterde farklılık gösteriyor!
Tony Andrews

Dualden sys_guid () seçmeyi deneyin ve değerleri karşılaştırın. Bununla ilgili yanıtı değiştirin.
Kiquenet

26

Ayrıca kılavuzu, tablonun create deyimine varsayılan olarak dahil edebilirsiniz, örneğin:

create table t_sysguid
( id     raw(16) default sys_guid() primary key
, filler varchar2(1000)
)
/

Buraya bakın: http://rwijk.blogspot.com/2009/12/sysguid.html


Beni bilmediğim yararlı bir Oracle özelliği konusunda uyardığınız için teşekkürler.
SteveT


7

Bir ekleme deyimine otomatik olarak bir kılavuz oluşturmakla ne demek istediğiniz net değil, ancak bir tahminde aşağıdakine benzer bir şey yapmaya çalıştığınızı düşünüyorum:

INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Adams');
INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Baker');

Bu durumda ID sütununun RAW (16) olarak bildirilmesi gerektiğine inanıyorum;

Bunu kafamın tepesinde yapıyorum. Test etmek için kullanışlı bir Oracle örneğim yok, ancak bence istediğiniz bu.


7

sys_guid (), diğer yanıtların da bahsettiği gibi zayıf bir seçenektir. UUID'ler oluşturmanın ve sıralı değerlerden kaçınmanın bir yolu, kendiniz rastgele onaltılık dizeler oluşturmaktır:

select regexp_replace(
    to_char(
        DBMS_RANDOM.value(0, power(2, 128)-1),
        'FM0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'),
    '([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{12})',
    '\1-\2-\3-\4-\5') from DUAL;

4
Bunların benzersiz olduğu garanti edilmez. Depoluyorsanız, depoladığınız her yerde benzersiz bir kısıtlama gibi bir şeyle eşleştirmeniz gerekir. (ve tekrarlanan bir değerle karşılaşırsanız ve benzersiz kısıtlamayı ihlal ederseniz, ancak bu olasılık düşükse yeni bir sayı üretme)
James Daily

2

Aşağıdaki sorguyu çalıştırabilirsiniz

 select sys_guid() from dual
 union all
 select sys_guid() from dual
 union all 
 select sys_guid() from dual

2

UUID'nizi oluşturmak için aşağıdaki işlevi kullanabilirsiniz

create or replace FUNCTION RANDOM_GUID
    RETURN VARCHAR2 IS

    RNG    NUMBER;
    N      BINARY_INTEGER;
    CCS    VARCHAR2 (128);
    XSTR   VARCHAR2 (4000) := NULL;
  BEGIN
    CCS := '0123456789' || 'ABCDEF';
    RNG := 15;

    FOR I IN 1 .. 32 LOOP
      N := TRUNC (RNG * DBMS_RANDOM.VALUE) + 1;
      XSTR := XSTR || SUBSTR (CCS, N, 1);
    END LOOP;

    RETURN SUBSTR(XSTR, 1, 4) || '-' ||
        SUBSTR(XSTR, 5, 4)        || '-' ||
        SUBSTR(XSTR, 9, 4)        || '-' ||
        SUBSTR(XSTR, 13,4)        || '-' ||
        SUBSTR(XSTR, 17,4)        || '-' ||
        SUBSTR(XSTR, 21,4)        || '-' ||
        SUBSTR(XSTR, 24,4)        || '-' ||
        SUBSTR(XSTR, 28,4);
END RANDOM_GUID;

Yukarıdaki işlev tarafından oluşturulan GUID örneği:
8EA4-196D-BC48-9793-8AE8-5500-03DC-9D04


SYS_GUID, ihtiyaçlarımız için yeterince rastgele değildi, ancak bu, çok daha rastgele GUID'leri pompalıyor gibi görünüyor.
ThePeter

2

Sıralı olmayan kılavuzlara ihtiyacınız varsa, sys_guid()sonuçları bir karma işlevi aracılığıyla gönderebilirsiniz (bkz. Https://stackoverflow.com/a/22534843/1462295 ). Buradaki fikir, orijinal yaratımdan kullanılan benzersizliği korumak ve daha karışık bitlerle bir şeyler elde etmektir.

Örneğin:

LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32))  

Varsayılan sıralı kılavuzu gösteren ve bir karma yoluyla göndermeyi gösteren örnek:

SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL
UNION ALL
SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL  

çıktı

80c32a4fbe405707e0531e18980a1bbb
80c32a4fbe415707e0531e18980a1bbb
80c32a4fbe425707e0531e18980a1bbb
80c32a4fbe435707e0531e18980a1bbb
c0f2ff2d3ef7b422c302bd87a4588490
d1886a8f3b4c547c28b0805d70b384f3
a0c565f3008622dde3148cfce9353ba7
1c375f3311faab15dc6a7503ce08182c

1

Oracle'ın "dbms_crypto.randombytes" işlevini kullanmanızı tavsiye ederim.

Neden? Bu işlev, şifreleme anahtarları için rastgele malzeme oluşturmak için kullanılabilen, kriptografik olarak güvenli sözde rastgele bayt dizisi içeren bir RAW değeri döndürür.

select REGEXP_REPLACE(dbms_crypto.randombytes(16), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5') from dual;

Yalnızca bir karakter değişirse "sys_guid" işlevini kullanmamalısınız.

ALTER TABLE locations ADD (uid_col RAW(16));

UPDATE locations SET uid_col = SYS_GUID();

SELECT location_id, uid_col FROM locations
   ORDER BY location_id, uid_col;

LOCATION_ID UID_COL
----------- ----------------------------------------------------------------
       1000 09F686761827CF8AE040578CB20B7491
       1100 09F686761828CF8AE040578CB20B7491
       1200 09F686761829CF8AE040578CB20B7491
       1300 09F68676182ACF8AE040578CB20B7491
       1400 09F68676182BCF8AE040578CB20B7491
       1500 09F68676182CCF8AE040578CB20B7491

https://docs.oracle.com/database/121/SQLRF/functions202.htm#SQLRF06120


0

350 karakterlik bir GUID oluşturma:

dbms_random.STRING ('a', 350) - karışık harf alfa karakterlerinde dize döndürme

dbms_random.STRING ('x', 350) - büyük harf alfa sayısal karakterlerle dize döndürme

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.