我在尝试使用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 "..."
。
所以我想问一下我创建一个唯一字符串的方式是否有问题。也许它不够“随机”?或者我错过了什么?
答案 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