2013-11-19 3 views
1

У меня возникла проблема при попытке обновить столбец с уникальной строкой в ​​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 "..." после некоторого времени выполнения этого запроса.

Так что я хотел бы спросить, есть ли что-то неправильно в том, как я генерирую уникальную строку. Может быть, это не «случайно»? Или я ничего не пропустил?

ответ

2

Ваша соляная строка одинакова для каждого исполнения, и если используемая вами временная метка одинакова, то есть, если время между выполнением меньше, чем точность временной переменной (секунды, миллисекунды или наносекунды, вероятно) то вы получите тот же результат псевдослучайного значения.

Чтобы обогатить ваше семя для генерации случайных значений, используйте последовательность:

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

+0

Спасибо за помощь! Я подозревал, что проблема была в «одинаковости» строки, но я также надеялся, что функция «random()» будет достаточной, чтобы гарантировать ее уникальность. –

Смежные вопросы