无法生成很多独特的字符串

时间:2013-11-19 08:55:54

标签: database postgresql postgresql-9.2 unique-constraint

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

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

UPDATE tableName 
  SET fieldName = 
      ENCODE(
          DIGEST(CONCAT('salt_string, EXTRACT(EPOCH FROM NOW()), random()), 'sha1'), 
      'hex')
WHERE fieldName IS NULL

但是在执行此查询一段时间后,我总是收到错误ERROR: duplicate key value violates unique constraint "..."

所以我想问一下我创建一个唯一字符串的方式是否有问题。也许它不够“随机”?或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

你的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;

您可以在此处详细了解如何创建序列:http://www.postgresql.org/docs/current/static/sql-createsequence.html

相关问题