Вопрос:
У меня есть одна таблица с именем:
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).