我有一个表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');