PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menghasilkan ID alfanumerik acak, unik, dengan panjang N di Postgres 9.6+?

Temukan ini, inilah fungsi yang melakukannya:

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;

Dan kemudian untuk menjalankannya cukup lakukan:

generate_uid(10)
-- '3Rls4DjWxJ'

Peringatan

Saat melakukan ini, Anda perlu memastikan bahwa panjang ID yang Anda buat cukup untuk menghindari tabrakan seiring waktu karena jumlah objek yang Anda buat bertambah, yang dapat menjadi kontra-intuitif karena Paradoks Ulang Tahun . Jadi, Anda mungkin menginginkan panjang yang lebih besar (atau jauh lebih besar) dari 10 untuk objek apa pun yang dibuat secara wajar, saya hanya menggunakan 10 sebagai contoh sederhana.

Penggunaan

Dengan fungsi yang ditentukan, Anda dapat menggunakannya dalam definisi tabel, seperti:

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

Dan kemudian saat memasukkan data, seperti:

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

Ini akan secara otomatis menghasilkan id nilai:

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

Penggunaan dengan Awalan

Atau mungkin Anda ingin menambahkan awalan untuk kenyamanan saat melihat satu ID di log atau di debugger Anda (mirip dengan bagaimana Stripe melakukannya ), seperti ini:

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. Flask dan SQLAlchemy menyebabkan banyak IDLE dalam koneksi transaksi di PostgreSQL

  2. Bagaimana cara mengekspor tabel sebagai CSV dengan judul di Postgresql?

  3. Bagaimana cara mengambil komentar dari database PostgreSQL?

  4. kueri postgres dengan IN sangat lambat

  5. Dapatkan nilai Kolom dari baris sebelumnya di postgres tidak dapat menggunakan fungsi jendela di UPDATE