Cách tạo GUID trong Oracle?


89

Có thể tự động tạo GUID vào câu lệnh Chèn không?

Ngoài ra, tôi nên sử dụng loại trường nào để lưu trữ GUID này?

Câu trả lời:


138

Bạn có thể sử dụng hàm SYS_GUID () để tạo GUID trong câu lệnh chèn của mình:

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

Kiểu dữ liệu ưa thích để lưu trữ GUID là RAW (16).

Như câu trả lời của Gopinath:

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

Bạn lấy

88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601

Như Tony Andrews nói, chỉ khác nhau ở một nhân vật

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

Có thể hữu ích: http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html


Thật kỳ lạ, sys_guid () luôn cung cấp cho tôi cùng một GUID .. Tôi có cần cung cấp hạt giống cho hàm hay không?
Acibi

10
Bạn có chắc chúng hoàn toàn giống nhau? Nó có xu hướng trả về các giá trị rất giống nhau (nhưng khác) - ví dụ: khi tôi vừa thử, tôi nhận được 88FDC68C75DEF955E040449808B55601 và 88FDC68C75DFF955E040449808B55601, chỉ khác ở ký tự thứ 12!
Tony Andrews

Hãy thử chọn sys_guid () từ các giá trị kép và so sánh. Sửa đổi câu trả lời về nó.
Kiquenet

26

Bạn cũng có thể bao gồm hướng dẫn trong câu lệnh tạo của bảng làm mặc định, ví dụ:

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

Xem tại đây: http://rwijk.blogspot.com/2009/12/sysguid.html


Cảm ơn vì đã thông báo cho tôi về một tính năng hữu ích của Oracle mà tôi chưa biết.
SteveT

7

Không rõ bạn có ý gì khi tự động tạo một hướng dẫn vào một câu lệnh chèn nhưng theo dự đoán, tôi nghĩ rằng bạn đang cố gắng làm điều gì đó như sau:

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

Trong trường hợp đó, tôi tin rằng cột ID nên được khai báo là RAW (16);

Tôi đang làm điều này ngoài đỉnh đầu của tôi. Tôi không có phiên bản Oracle hữu ích để kiểm tra, nhưng tôi nghĩ đó là những gì bạn muốn.



4

sys_guid () là một tùy chọn kém, như các câu trả lời khác đã đề cập. Một cách để tạo UUID và tránh các giá trị tuần tự là tự tạo chuỗi hex ngẫu nhiên:

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;

3
Chúng không được đảm bảo là duy nhất. Bạn cần phải ghép nối nó với một thứ gì đó giống như một ràng buộc duy nhất ở bất cứ nơi nào bạn lưu trữ nó, nếu bạn đang lưu trữ nó. (và tạo một số mới nếu bạn gặp phải một giá trị lặp lại và vi phạm giới hạn duy nhất, tuy nhiên điều đó khó có thể xảy ra)
James Daily

2

Bạn có thể chạy truy vấn sau

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

2

bạn có thể sử dụng hàm bên dưới để tạo UUID của mình

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;

Ví dụ về GUID được định địa chỉ bởi hàm trên:
8EA4-196D-BC48-9793-8AE8-5500-03DC-9D04


SYS_GUID không đủ ngẫu nhiên cho nhu cầu của chúng tôi, nhưng điều này dường như bơm GUID trở nên ngẫu nhiên hơn.
ThePeter

1

Nếu bạn cần các guids không tuần tự, bạn có thể gửi sys_guid()kết quả thông qua hàm băm (xem https://stackoverflow.com/a/22534843/1462295 ). Ý tưởng là giữ bất kỳ tính độc đáo nào được sử dụng từ tác phẩm gốc và nhận được thứ gì đó với nhiều bit xáo trộn hơn.

Ví dụ:

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

Ví dụ hiển thị hướng dẫn tuần tự mặc định so với gửi nó qua một hàm băm:

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  

đầu ra

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

0

Tôi khuyên bạn nên sử dụng hàm "dbms_crypto.randombytes" của Oracle.

Tại sao? Hàm này trả về giá trị RAW chứa một chuỗi byte giả ngẫu nhiên được bảo mật về mặt mật mã, có thể được sử dụng để tạo vật liệu ngẫu nhiên cho các khóa mã hóa.

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

Bạn không nên sử dụng hàm "sys_guid" nếu chỉ có một ký tự thay đổi.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.