Я пытаюсь найти лучший способ вставить запись в одну таблицу, но только если элемент еще не существует. Ключевым в этом случае является поле NVARCHAR (400). В этом примере давайте притворимся, что это имя слова в Оксфордском словаре английского языка/вставьте словарь fav здесь. Кроме того, я предполагаю, что мне нужно будет сделать поле Word первичным ключом. (таблица также будет иметь уникальный идентификатор PK).
Итак, я могу получить эти слова, которые мне нужно добавить в таблицу...
например.
- Cat
- Собака
- Foo
- Bar
- PewPew
- и т.д...
Так традиционно, я бы попробовал следующий (псевдокод)
SELECT WordID FROM Words WHERE Word = @Word
IF WordID IS NULL OR WordID <= 0
INSERT INTO Words VALUES (@Word)
т. Если слово не существует, вставьте его.
Теперь... проблема, о которой я беспокоюсь, заключается в том, что мы получаем множество хитов.. так что возможно, что это слово может быть вставлено из другого процесса между SELECT и INSERT.., который затем будет бросать ошибка ограничения? (т.е. Состояние гонки).
Тогда я подумал, что могу сделать следующее...
INSERT INTO Words (Word)
SELECT @Word
WHERE NOT EXISTS (SELECT WordID FROM Words WHERE Word = @Word)
в принципе, вставьте слово, если оно не существует.
Отброшенный синтаксис в стороне, я не уверен, что это плохо или хорошо из-за того, как он блокирует таблицу (если это так) и не является тем, что на столе, что он получает массивные чтения и много записей.
Итак, что вы думаете/делаете ли вы Sql гуру?
Я надеялся иметь простую вставку и "уловку" для любых ошибок.