SQL INSERT INTO xxx WHERE NOT EXIST

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

Простая таблица, autoID, статус, тип

INSERT INTO alarms (status, type) 
SELECT * FROM (SELECT '2', '1') AS tmp
WHERE NOT EXISTS
( SELECT type FROM alarms WHERE (type = '1')) LIMIT 1;

Это работает нормально, он будет вставлен только в том случае, если нет других записей с типом 1. Я хотел бы иметь несколько критериев, например, если они уже есть в таблице type=1 И status=5, тогда вставьте новую запись type=1 и status=2. Я пробовал следующее (с несколькими вариантами), но не могу заставить его работать. Никаких ошибок, просто ведет себя так, как будто есть только один критерий.

 INSERT INTO alarms (status, type) 
    SELECT * FROM (SELECT '2', '1') AS tmp
    WHERE NOT EXISTS
    ( SELECT type, status FROM alarms WHERE (type = '1' AND status = '5')) LIMIT 1;

Любой совет? Или мне нужно сделать отдельный вызов, чтобы определить наличие нескольких критериев. Спасибо.

Вы пробовали вместо этого использовать if / begin / end?

Alan Pallath 17.07.2018 09:48
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
101
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пытались вместо этого использовать if-begin-end? Код мог бы быть проще, но я полагаю, это все равно считается одним оператором.

 If Not Exists( SELECT type, status FROM alarms WHERE (type = '1' AND status = '5'))
    Begin
    INSERT INTO alarms (status, type) values ("Y","type")
    End

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

Graeme Townsend 17.07.2018 15:07

Попробуйте использовать "HAVING"

INSERT INTO alarms (status, type)
SELECT status, type
FROM alarms_duplicated AS a
WHERE status = '2' AND type = '1'
GROUP BY status, type
HAVING COUNT(*) = 1
Ответ принят как подходящий

спасибо за ваш вклад. Я бы выглядел так, как будто IF NOT EXIST .... WHERE не будет работать, по-видимому, оператор WHERE несовместим с mySQL. Так что я сделал это по-другому!

(Совершенно другой подход к рассматриваемому вопросу, не относящийся к этому обсуждению).

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