Разбрахме това, ето функция, която го прави:
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;
И след това, за да го стартирате, просто направете:
generate_uid(10)
-- '3Rls4DjWxJ'
Предупреждение
Когато правите това, трябва да сте сигурни, че дължината на идентификаторите, които създавате, е достатъчна, за да избегнете сблъсъци с течение на времето, тъй като броят на създадените от вас обекти расте, което може да бъде контраинтуитивно поради Парадокс за рожден ден
. Така че вероятно ще искате дължина, по-голяма (или много по-голяма) от 10
за всеки сравнително често създаван обект използвах 10
като прост пример.
Използване
С дефинираната функция можете да я използвате в дефиниция на таблица, така:
CREATE TABLE collections (
id TEXT PRIMARY KEY DEFAULT 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
стойности:
id | name | ...
-----------+--------+-----
owmCAx552Q | ian |
ZIofD6l3X9 | victor |
Използване с префикс
Или може би искате да добавите префикс за удобство, когато разглеждате единичен идентификатор в регистрационните файлове или във вашия инструмент за отстраняване на грешки (подобно на как го прави Stripe ), така:
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 |