Как проверить, существует ли запись перед вставкой в ​​​​таблицу sql

У меня есть таблица под названием 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. Может ли кто-нибудь помочь мне с этим?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
3 258
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не проверяйте заранее, а позвольте базе данных сделать это за вас, внедрив для нее ограничение UNIQUE. В противном случае всегда будет шанс, что другой поток вставит строку между проверкой и вставкой.

Например:

alter table panels add constraint uq1 (id, p_type);

Затем, если INSERT терпит неудачу, значит, комбинация уже существовала.

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

Analia 18.12.2020 19:00
Ответ принят как подходящий

Я думаю, вы можете использовать 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)

Вы проверили это?

Analia 18.12.2020 19:10

Неа. Но это стандартный sql.

Popeye 18.12.2020 19:12

Что должна означать 1? Я немного смущен. Можете ли вы внести некоторую ясность, пожалуйста?

Analia 18.12.2020 19:14

1 в наличии. Ничего. Вы можете использовать null или * там. Предложение Exists в основном проверяет, возвращает ли запрос какую-либо строку или нет.

Popeye 18.12.2020 19:16

Другие вопросы по теме