Tôi không khẳng định những điều sau đây là hiệu quả, nhưng đó là cách chúng tôi đã thực hiện loại việc này trong quá khứ.
CREATE FUNCTION make_uid() RETURNS text AS $$
DECLARE
new_uid text;
done bool;
BEGIN
done := false;
WHILE NOT done LOOP
new_uid := md5(''||now()::text||random()::text);
done := NOT exists(SELECT 1 FROM my_table WHERE uid=new_uid);
END LOOP;
RETURN new_uid;
END;
$$ LANGUAGE PLPGSQL VOLATILE;
make_uid()
có thể được sử dụng làm mặc định cho một cột trong my_table
. Một cái gì đó như:
ALTER TABLE my_table ADD COLUMN uid text NOT NULL DEFAULT make_uid();
md5(''||now()::text||random()::text)
có thể được điều chỉnh để hương vị. Bạn có thể xem xét encode(...,'base64')
ngoại trừ một số ký tự được sử dụng trong base-64 không thân thiện với URL.