PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да генерирам случаен, уникален, буквено-цифров идентификатор с дължина N в Postgres 9.6+?

Разбрахме това, ето функция, която го прави:

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 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете датата на създаване на база данни в PostgreSQL

  2. създаване на псевдосвързан списък в sql

  3. PostgreSQL схеми/пространства от имена с Django

  4. Справяне с бавни заявки с PostgreSQL

  5. Връща първите x резултати от всяка група в SQL заявка