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

Tạo chuỗi ngẫu nhiên duy nhất trong plpgsql

Không có repeat câu lệnh trong plpgsql. Sử dụng vòng lặp loop đơn giản .

CREATE OR REPLACE FUNCTION random_token(_table TEXT, _column TEXT, _length INTEGER) RETURNS text AS $$
DECLARE
  alphanum CONSTANT text := 'abcdefghijkmnopqrstuvwxyz23456789';
  range_head CONSTANT integer := 25;
  range_tail CONSTANT integer := 33;
  random_string text;
  ct int;
BEGIN
  LOOP
    SELECT substring(alphanum from trunc(random() * range_head + 1)::integer for 1) ||
      array_to_string(array_agg(substring(alphanum from trunc(random() * range_tail + 1)::integer for 1)), '')
      INTO random_string FROM generate_series(1, _length - 1);
    EXECUTE FORMAT('SELECT count(*) FROM %I WHERE %I = %L', _table, _column, random_string) INTO ct;
    EXIT WHEN ct = 0;
  END LOOP;
  RETURN random_string;
END
$$ LANGUAGE plpgsql;

Lưu ý, random_string phải là một tham số cho format() .

Cập nhật. Theo gợi ý chính xác từ Abelisto, điều này sẽ nhanh hơn đối với một bảng lớn:

DECLARE
  dup boolean;
...
    EXECUTE FORMAT('SELECT EXISTS(SELECT 1 FROM %I WHERE %I = %L)', _table, _column, random_string) INTO dup;
    EXIT WHEN NOT dup;
...


  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 biết múi giờ của dấu thời gian trong postgresql 8.3

  2. Nơi các tệp cơ sở dữ liệu Postgres được lưu trong ubuntu?

  3. Postgresql:Không thể truy cập vào tệp «$ libdir / postgis-2.1» không có tệp hoặc thư mục như vậy

  4. Sử dụng Django ORM trong chuỗi và tránh quá nhiều ngoại lệ ứng dụng khách bằng cách sử dụng BoundSemaphore

  5. postgresql:tham gia với điều kiện và không trùng lặp