Đã tìm ra điều này, đây là một chức năng thực hiện điều đó:
CREATE OR REPLACE FUNCTION generate_uid(size INT) RETURNS TEXT AS $$
DECLARE
characters TEXT := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
bytes BYTEA := gen_random_bytes(size);
l INT := length(characters);
i INT := 0;
output TEXT := '';
BEGIN
WHILE i < size LOOP
output := output || substr(characters, get_byte(bytes, i) % l + 1, 1);
i := i + 1;
END LOOP;
RETURN output;
END;
$$ LANGUAGE plpgsql VOLATILE;
Và sau đó để chạy nó chỉ cần làm:
generate_uid(10)
-- '3Rls4DjWxJ'
Cảnh báo
Khi làm điều này, bạn cần đảm bảo rằng độ dài của ID bạn đang tạo là đủ để tránh xung đột theo thời gian khi số lượng đối tượng bạn đã tạo ngày càng tăng, điều này có thể phản trực quan vì Nghịch lý sinh nhật
. Vì vậy, bạn có thể sẽ muốn độ dài lớn hơn (hoặc lớn hơn nhiều) so với 10
đối với bất kỳ đối tượng thường được tạo hợp lý nào, tôi chỉ sử dụng 10
như một ví dụ đơn giản.
Cách sử dụng
Với hàm được định nghĩa, bạn có thể sử dụng nó trong định nghĩa bảng, như sau:
CREATE TABLE collections (
id TEXT PRIMARY KEY DEFAULT generate_uid(10),
name TEXT NOT NULL,
...
);
Và sau đó khi chèn dữ liệu, như sau:
INSERT INTO collections (name) VALUES ('One');
INSERT INTO collections (name) VALUES ('Two');
INSERT INTO collections (name) VALUES ('Three');
SELECT * FROM collections;
Nó sẽ tự động tạo id
giá trị:
id | name | ...
-----------+--------+-----
owmCAx552Q | ian |
ZIofD6l3X9 | victor |
Cách sử dụng với Tiền tố
Hoặc có thể bạn muốn thêm tiền tố để thuận tiện khi xem một ID duy nhất trong nhật ký hoặc trong trình gỡ lỗi của mình (tương tự như cách Stripe thực hiện ), như vậy:
CREATE TABLE collections (
id TEXT PRIMARY KEY DEFAULT ('col_' || generate_uid(10)),
name TEXT NOT NULL,
...
);
INSERT INTO collections (name) VALUES ('One');
INSERT INTO collections (name) VALUES ('Two');
INSERT INTO collections (name) VALUES ('Three');
SELECT * FROM collections;
id | name | ...
---------------+--------+-----
col_wABNZRD5Zk | ian |
col_ISzGcTVj8f | victor |