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:
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
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
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.
Ví dụ được tìm thấy trên: http://www.orafaq.com/usenet/comp.databases.oracle.server/2006/12/20/0646.htm
SELECT REGEXP_REPLACE(SYS_GUID(), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5') MSSQL_GUID FROM DUAL
Kết quả:
6C7C9A50-3514-4E77-E053-B30210AC1082
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;
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
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
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
Tôi khuyên bạn nên sử dụng hàm "dbms_crypto.randombytes" của Oracle.
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