SQL Server 2000 эквивалент для ключа дублирования? - PullRequest
4 голосов
/ 08 февраля 2010

Существует ли функциональность SQL Server 2000, эквивалентная предложению MySQL ON DUPLICAT KEY? Этот ответ побудил меня взглянуть на конструкцию вместо триггера, но пример выглядит неуклюжим, и функциональность будет скрыта в триггере, а не будет непосредственно в хранимом процессе.

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

Ответы [ 3 ]

2 голосов
/ 08 февраля 2010

Я использую это:

begin tran;

update ... where ... ;

if @@rowcount = 0
  insert ...
commit tran;

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

1 голос
/ 08 февраля 2010

Также неуклюже, но вы могли бы сделать это в своей процедуре:

insert ... where not exists (...);

update ....;

зная, что ваша вставка сработает, когда данные новые, а ваше обновление - только при наличии данных.

1 голос
/ 08 февраля 2010

upsert

http://en.wikipedia.org/wiki/Upsert

INSERT ... WHERE NOT EXISTS (SELECT 1 FROM table WHERE id = ?)

1010 * сливаться *

но я думаю, что это только в SQL 2003

MERGE INTO table_name USING table_name ON (condition)
  WHEN MATCHED THEN
  UPDATE SET column1 = value1 [, column2 = value2 ...]
  WHEN NOT MATCHED THEN
  INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...])

http://en.wikipedia.org/wiki/Merge_(SQL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...