【问题标题】:Cannot generate a lot of unique strings无法生成很多唯一字符串
【发布时间】:2013-11-19 08:55:54
【问题描述】:

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

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

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 "..."

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

【问题讨论】:

    标签: database postgresql postgresql-9.2 unique-constraint


    【解决方案1】:

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

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

    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

    【讨论】:

    • 感谢您的帮助!我怀疑问题出在字符串的sameness 上,但我也希望random() 函数足以保证它的唯一性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2011-09-24
    • 2021-07-08
    • 2012-06-17
    • 2012-11-21
    • 2010-10-18
    相关资源
    最近更新 更多