2016-02-04 3 views
3

Я условно вставки строки в столе PostgreSQL и вручную указав ID:Предварительная последовательность (`nextval`) в PostgreSQL, если строка вставляется

INSERT INTO foo (foo_id, foo_name) 
SELECT 4, 'My Name' 
WHERE NOT EXISTS (
    SELECT * FROM foo WHERE foo_id = 4 
); 

Это не будет увеличивать последовательность, которая генерирует следующий foo_id.

Как я могу запустить SELECT nextval('foo_foo_id_seq'::regclass); только в том случае, если строка в действительности является вложением в указанный выше запрос?

+0

ли вы хотите последовательность продолжать с этим номером, или Вы хотите, чтобы увеличить последовательность относительно того, что такое текущее значение? (Но в обоих случаях вы рискуете получить уникальные ключевые нарушения позже) –

+0

Продолжая с этим номером, вы будете работать. Например, в этом случае, если строка вставлена, я хочу, чтобы следующее значение последовательности было равно 5. – s16h

ответ

2

Вы можете поставить новое значение для последовательности с использованием setval()

Если вы хотите изменить последовательность для продолжения «принудительного» значения, вы можете использовать setval() внутри выберите:

INSERT INTO foo (id, foo_name) 
select * 
from (
    VALUES (setval('foo_id_seq', 42), 'My Name') 
) as t (id, foo_name) 
WHERE NOT EXISTS (
    SELECT * FROM foo WHERE id = 42 
); 

Если строка вставлена, последовательность будет продолжена с 43.

Если текущее значение последовательности уже больше 43, то будет, если возникнут проблемы, если o ther транзакции вставляются в таблицу и полагаются на последовательность.


Если вы хотите, чтобы продвинуть последовательность из любого значения, в настоящее время он имеет, вы можете использовать что-то вроде этого:

INSERT INTO foo (id, foo_name) 
select id, foo_name 
from (
    VALUES (42, 'My Name', nextval('foo_id_seq')) 
) as t (id, foo_name, nextval) 
WHERE NOT EXISTS (
    SELECT * FROM foo WHERE id = 42 
); 
+0

Хм, это будет работать, но я очень хочу убедиться, что ID моего имени равен 1 (в моем случае это фактически не 1 - так что это не обязательно первая вставка, которая происходит в таблице). – s16h

+0

@ s16h: зачем вам это нужно? Вы не должны полагаться на определенные значения идентификатора. –

+0

Я понимаю и согласен с вами. Но мне нужно сделать это в этом случае. – s16h

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