Как избежать дублирования значений для INSERT в SQL?

Вопрос:У меня есть одна таблица с именем: Delegates В этой таблице четыре поля: ID(Auto increment, Primary) MemberNo, FromYr, ToYr Я вставляю этот запрос: INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr) Значения поступают от пользовательского ввода. Один из участников может быть делегатом в течение любого года, поэтому я разрешаю им вводить их по своему усмотрению. Но теперь

Вопрос:

У меня есть одна таблица с именем:

Delegates

В этой таблице четыре поля:

ID(Auto increment, Primary) MemberNo, FromYr, ToYr

Я вставляю этот запрос:

INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr)

Значения поступают от пользовательского ввода. Один из участников может быть делегатом в течение любого года, поэтому я разрешаю им вводить их по своему усмотрению. Но теперь проблема в том, что они могут ошибочно вставить один член за тот же год более чем в 2 раза.
Пожалуйста, помогите мне, что я могу сделать сейчас?

Лучший ответ:

Перед установкой проверьте, есть ли запись с теми же значениями:

if not exists (select * from Delegates d where d.FromYr = @FromYr and d.MemNo = @MemNo) INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr) Ответ №1

Используйте MERGE

MERGE INTO Delegates D USING (values(@MemNo, @FromYr,@ToYr)) X ([MemNo],[FromYr],[ToYr]) ON (insert unique key join) WHEN NOT MATCHED BY TARGET THEN INSERT ([MemNo],[FromYr],[ToYr])) VALUES (X.[MemNo],X.[FromYr],X.[ToYr]); Ответ №2

Попробуйте, (я еще не подтвердил)

INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr) where @MemNo not in ( SELECT MemNo FROM words WHERE FromYr = @FromYr ) Ответ №3

Просто добавьте уникальный индекс в этот столбец, после чего вставка дубликатов вызовет ошибку. Затем вы можете обработать ошибку, если она нуждается в изящном изложении

Ответ №4

создать хранимую процедуру, которая сначала проверит, уже ли значения содержатся в БД. если они не готовы, вы сделаете свою вставку. Если они просто игнорируют его

Ответ №5

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

INSERT INTO Delegates (MemNo, FromYr, ToYr) SELECT @MemNo, @FromYr, @ToYr WHERE NOT EXISTS (SELECT 1 FROM Delegates d WHERE d.MemNo=@MemNo AND d.FromYr=@FromYr)

Если это среда с высокой нагрузкой, где другая команда может вставить дубликат во время выполнения этой команды, вы можете использовать подсказку WITH(HOLDLOCK).

Оцените статью
Добавить комментарий