Я пытаюсь найти лучший способ вставить запись в одну таблицу, но только если элемент еще не существует. КЛЮЧ в этом случае является полем NVARCHAR (400). В этом примере давайте представим, что это имя word в Оксфордском словаре английского языка / вставьте здесь ваш любимый словарь. Кроме того, я думаю, мне нужно сделать поле Word первичным ключом. (таблица также будет иметь уникальный идентификатор PK).
Итак ... я мог бы получить эти слова, которые мне нужно добавить в таблицу ...
например.
- Кошка
- Собака
- Foo
- Бар
- ПьюПью
- и т.д ...
Традиционно, я бы попробовал следующее (псевдокод)
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 гуру, думаете / делаете?
Я надеялся получить простую вставку и «поймать» ее для любых сгенерированных ошибок.