sql >> Database >  >> RDS >> PostgreSQL

Hoe genereer je een willekeurige, unieke, alfanumerieke ID met lengte N in Postgres 9.6+?

Dit bedacht, hier is een functie die het doet:

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;

En om het vervolgens uit te voeren, doe je gewoon:

generate_uid(10)
-- '3Rls4DjWxJ'

Waarschuwing

Wanneer u dit doet, moet u er zeker van zijn dat de lengte van de ID's die u aanmaakt voldoende is om botsingen in de loop van de tijd te voorkomen naarmate het aantal objecten dat u hebt gemaakt groeit, wat contra-intuïtief kan zijn vanwege de Verjaardagsparadox . Je zult dus waarschijnlijk een lengte willen die groter (of veel groter) is dan 10 voor elk redelijk algemeen gemaakt object heb ik zojuist 10 . gebruikt als een eenvoudig voorbeeld.

Gebruik

Als de functie is gedefinieerd, kunt u deze als volgt in een tabeldefinitie gebruiken:

CREATE TABLE collections (
  id TEXT PRIMARY KEY DEFAULT generate_uid(10),
  name TEXT NOT NULL,
  ...
);

En dan bij het invoegen van gegevens, zoals zo:

INSERT INTO collections (name) VALUES ('One');
INSERT INTO collections (name) VALUES ('Two');
INSERT INTO collections (name) VALUES ('Three');
SELECT * FROM collections;

Het genereert automatisch de id waarden:

    id     |  name  | ...
-----------+--------+-----
owmCAx552Q | ian    |
ZIofD6l3X9 | victor |

Gebruik met een voorvoegsel

Of misschien wil je voor het gemak een voorvoegsel toevoegen wanneer je naar een enkele ID in de logs of in je debugger kijkt (vergelijkbaar met hoe Stripe het doet ), zoals zo:

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. Hoe een PostgreSQL-query uit het Wireshark-bestand te vinden (decoderen)?

  2. NULL-waarde verwerken in UNPIVOT

  3. Trigger in mysql veroorzaakt fout

  4. Vergelijk arrays voor gelijkheid, negeer de volgorde van elementen