Database 无法生成许多唯一字符串

Database 无法生成许多唯一字符串,database,postgresql,postgresql-9.2,unique-constraint,Database,Postgresql,Postgresql 9.2,Unique Constraint,在PostgreSQL中尝试使用唯一字符串更新列时遇到问题。我有一张表,里面有大约30kk的记录。我想要的是为特定列设置一个唯一的sha1值(我们称之为fieldName),但仅针对该列为NULL的行-表中大约有20kk此类记录。字段名列有一个唯一的约束 所以,我写了一个简单的查询: UPDATE tableName SET fieldName = ENCODE( DIGEST(CONCAT('salt_string, EXTRACT(EPOCH FROM

在PostgreSQL中尝试使用唯一字符串更新列时遇到问题。我有一张表,里面有大约30kk的记录。我想要的是为特定列设置一个唯一的
sha1
值(我们称之为
fieldName
),但仅针对该列为
NULL
的行-表中大约有20kk此类记录。
字段名
列有一个
唯一的
约束

所以,我写了一个简单的查询:

UPDATE tableName 
  SET fieldName = 
      ENCODE(
          DIGEST(CONCAT('salt_string, EXTRACT(EPOCH FROM NOW()), random()), 'sha1'), 
      'hex')
WHERE fieldName IS NULL
但我总是会得到一个错误:执行此查询一段时间后,重复的键值违反了唯一约束“…”


所以我想问一下,生成唯一字符串的方式是否有问题。也许这还不够“随机”呢?还是我遗漏了什么?

您的salt字符串对于每次执行都是相同的,并且如果您使用的时间戳也是相同的,即如果执行之间的时间小于时间变量的精度(可能是秒、毫秒或纳秒),那么您将得到相同的伪随机值结果

要丰富随机值生成的种子,请使用序列:

CREATE TEMP SEQUENCE my_own_sequence;
UPDATE tableName 
  SET fieldName = 
      ENCODE(
          DIGEST(CONCAT('salt_string, EXTRACT(EPOCH FROM NOW(), nextval('my_own_sequence')), random()), 'sha1'), 
      'hex')
WHERE fieldName IS NULL;

您可以在此处阅读有关创建序列的更多信息:

谢谢您的帮助!我怀疑问题出在字符串的
相同性上,但我也希望
random()
函数足以保证它的唯一性。