postgre在SQL中为列生成唯一随机哈希的最方便方法



我有一个表foo,其中有一个名为hash的不可为Null且唯一的列。我想创建一个触发器,或者如果可能的话,默认为该列,它生成一个唯一的随机64字符字符串。

尽管可以创建这样的默认值,但这并不能阻止生成非唯一哈希的低几率。

alter TABLE foo ADD column register_key text UNIQUE NOT NULL default md5(random()::text);

我正在plpgsql中创建一个触发器,但很难比较我生成的哈希。

以下是我试图做的,我创建了一个函数,该函数返回一个触发器,该触发器将生成散列

create or replace function generate_hash() returns trigger
as $$
declare temp_hash text;
counter int;
begin
while exists(select * from foo where hash = temp_hash) and counter < 10 loop
select substr(sha512(random()::text), 0, 64) into temp_hash;
counter := counter + 1;
end loop;
if counter >= 10 
then RAISE EXCEPTION 'cannot generate hash';
end if;
new.hash = temp_hash;
return new;
end;
$$ language plpgsql;

并在表foo上创建了一个触发器

CREATE TRIGGER insert_hash
BEFORE INSERT ON foo
FOR EACH ROW EXECUTE PROCEDURE generate_hash();

当我通过插入一条新记录对此进行测试时,我收到了错误ERROR: null value in column "hash" violates not-null constraint

我做错了什么?有没有比我现在做的更合适的方法?

由于数据一次插入一行,因此可以使用时间戳作为哈希值,如:

alter TABLE foo ADD column register_key varchar(64) 
UNIQUE NOT NULL default encode(digest(now()::text, 'sha256'), 'hex');

相关内容

  • 没有找到相关文章

最新更新