Возможно ли реализовать ручное увеличение с помощью простого SQL INSERT? - PullRequest
6 голосов
/ 27 апреля 2009

У меня есть первичный ключ, который я не хочу автоматически увеличивать (по разным причинам), поэтому я ищу способ просто увеличить это поле, когда я ВСТАВЛЯЮ. Просто я имею в виду без хранимых процедур и без триггеров, поэтому просто последовательность команд SQL (желательно одна команда).

Вот что я пробовал до сих пор:

BEGIN TRAN

INSERT INTO Table1(id, data_field)
VALUES ( (SELECT (MAX(id) + 1) FROM Table1), '[blob of data]');

COMMIT TRAN;

* Data abstracted to use generic names and identifiers

Однако при выполнении команда выдает ошибку, говоря, что

"Подзапросы не разрешены в этом контекст. только скалярные выражения разрешено "

Итак, как я могу это сделать / что я делаю не так?


РЕДАКТИРОВАТЬ: Поскольку это было указано в качестве рассмотрения, гарантируется, что таблица для вставки будет иметь как минимум 1 строку.

Ответы [ 11 ]

0 голосов
/ 27 апреля 2009

Если вы делаете это в триггере, вы можете убедиться, что это триггер «INSTEAD OF», и сделать это в паре операторов:

DECLARE @next INT
SET @next = (SELECT (MAX(id) + 1) FROM Table1)

INSERT INTO Table1
VALUES (@next, inserted.datablob)

Единственное, с чем вам следует быть осторожным, это параллелизм - если две строки вставляются одновременно, они могут попытаться использовать одно и то же значение для @next, вызывая конфликт.

Это делает то, что вы хотите?

...