Автоматическое увеличение TSQL при обновлении - PullRequest
3 голосов
/ 28 июня 2011

SQL Server 2008 +

У меня есть таблица с автоинкрементным столбцом, который я хотел бы увеличить не только при вставке, но и при обновлении. Этот столбец не является первичным ключом, но есть также первичный ключ, который представляет собой GUID, созданный автоматически с помощью newid ().

Насколько я могу судить, есть два способа сделать это.

1.) Удалите существующую строку и вставьте новую строку с идентичными значениями (плюс любые обновления).

или

2.) Обновите существующую строку и используйте следующее, чтобы получить «следующее» значение идентификатора:

IDENT_CURRENT('myTable') + IDENT_INCR('myTable')

В любом случае я вынужден разрешить вставку идентификатора. (С опцией 1, потому что первичный ключ для таблицы должен оставаться прежним, а с опцией 2, потому что я обновляю столбец автоинкремента определенным значением.) Я не уверен, каковы последствия блокировки / производительности это.

Есть мысли по этому поводу? Есть ли лучший подход? Целью здесь является сохранение постоянно увеличивающегося набора целочисленных значений в столбце всякий раз, когда строка вставляется или обновляется.

Ответы [ 3 ]

4 голосов
/ 28 июня 2011

Я думаю, что столбец типа rowversion (ранее известный как "timestamp") может быть вашим самым простым выбором, хотя при 8 байтах они могут составлять довольно большие целые числа.Синтаксис «timestamp» не рекомендуется в пользу инверсии строк (поскольку ISO SQL имеет тип данных timestamp).

Если вы останетесь с подходом столбца Identity, вы, вероятно, захотите поместить свою логику в триггер UPDATE,фактически заменит UPDATE на описанную вами комбинацию INSERT и DELETE.

Обратите внимание, что значения столбца Identity не обязательно являются последовательными, а только увеличиваются.

2 голосов
/ 28 июня 2011

Столбцы со свойством идентичности не могут быть обновлены. После того, как столбцу со свойством идентификатора присвоено значение, либо автоматически, либо с включенным identity_insert, оно становится неизменным значением. Кроме того, свойство identity не может быть отключено или удалено с помощью alter column.

Я считаю, что вы хотите взглянуть на SQL Server TIMESTAMP (теперь он называется rowversion в SQL Server 2008). Это принципиально автоинкрементное двоичное значение. Каждая база данных имеет уникальный счетчик строк. Каждая вставка / обновление строки в таблице со столбцом метки времени / строки приводит к увеличению счетчика и новому значению, назначенному для вставленной / измененной строки.

2 голосов
/ 28 июня 2011

Должен ли это быть целочисленный столбец?Столбец метки времени предоставит вам функциональность, которую вы ищете из коробки.

...