2016-11-14 2 views
1

У меня есть таблицаPostgreSQL BIGSERIAL и "дубликат ключа" на вставке

CREATE TABLE users (
    id BIGSERIAL NOT NULL PRIMARY KEY, 
    created_at TIMESTAMP DEFAULT NOW() 
); 

Сначала я бегу

INSERT INTO users (id) VALUES (1); 

После бегаю

INSERT INTO users (created_at) VALUES ('2016-11-10T09:37:59+00:00'); 

И я получаю

ERROR: duplicate key value violates unique constraint "users_pkey" DETAIL: Key (id)=(1) already exists.

Почему идентификационная последовательность не увеличивается, когда я сам вставляю «id»?

ответ

2

Это связано с тем, что предложение DEFAULT оценивается только в том случае, если вы опускаете столбец в предложении SET или вставляете специальное значение DEFAULT.

В вашем первом INSERT предложение DEFAULT не оценивается, поэтому последовательность не увеличивается. Ваш второй INSERT использует предложение DEFAULT, последовательность увеличивается и возвращает значение 1, которое сталкивается со значением, явно указанным в предыдущем .

Не смешивайте INSERT с автоматическим построением значений с использованием последовательностей и INSERT s, которые явно указывают столбец. Или, если вам нужно, вы должны убедиться, что значения не могут столкнуться, например. используя четные числа для автоматически генерируемых значений и нечетных чисел для явного INSERT s.