У меня есть таблица под названием Panels, как показано ниже, со следующей записью на данный момент.
---Panel table
p_id sequence p_type
1 2 '3a'
... and many more rows
Я использую следующий запрос, чтобы вставить в таблицу Panels новую запись с p_type='4a'. Чтобы создать новую запись, я буду использовать p_type='3a'. Моя проблема заключается в том, как я могу проверить, существует ли запись для p_type='4a' в таблице, прежде чем выполнять INSERT INTO.
Пытаясь найти решение в Интернете, я нашел следующий код шаблона.
if not exists (select column_1 from table_name where column_1 = value)
begin
insert statement here
end
go
Моя логика вставки выглядит следующим образом:
INSERT INTO Panels (p_id,sequence,p_type)
SELECT p_id,sequence,'4a'
FROM Panels
WHERE p_type='3a'
Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как интегрировать логику кода шаблона, приведенную выше, с моей инструкцией INSERT INTO. Может ли кто-нибудь помочь мне с этим?
Не проверяйте заранее, а позвольте базе данных сделать это за вас, внедрив для нее ограничение UNIQUE. В противном случае всегда будет шанс, что другой поток вставит строку между проверкой и вставкой.
Например:
alter table panels add constraint uq1 (id, p_type);
Затем, если INSERT терпит неудачу, значит, комбинация уже существовала.
Я думаю, вы можете использовать not exists следующим образом:
INSERT INTO Panels (p_id,sequence,p_type)
SELECT p_id,sequence,'4a'
FROM Panels p
WHERE p_type='3a'
And not exists
(select 1 from Panels pp
WHERE pp.p_type='4a'
and p.p_id = pp.p_id
and p.sequence = pp.sequence)
Вы проверили это?
Неа. Но это стандартный sql.
Что должна означать 1? Я немного смущен. Можете ли вы внести некоторую ясность, пожалуйста?
1 в наличии. Ничего. Вы можете использовать null или * там. Предложение Exists в основном проверяет, возвращает ли запрос какую-либо строку или нет.
Как я могу это сделать, используя проблему, которая у меня есть? Я не хочу использовать подход ограничений. Я знаю, что это хорошо, но я не могу изменить эту базу данных, мне нужно использовать ее как есть.