PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để tạo ID ngẫu nhiên, duy nhất, gồm chữ và số có độ dài N trong Postgres 9.6+?

Đã 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 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách make_timestamp () hoạt động trong PostgreSQL

  2. postgreSQL.app:tạo cơ sở dữ liệu

  3. Postgres truy vấn SQL lồng nhau để đếm trường

  4. Cách định dạng số dưới dạng tiền tệ trong PostgreSQL

  5. Câu lệnh GROUP BY + CASE