Как проверить имеющуюся идентичную строку перед вставкой новой?

Добрый день, подскажите пожалуйста, можно ли в INSERT заложить дополнительную логику, или же нужно отдельно сначала логику, а потом уже действие

Имеется таблица
id ; login ; host ; event_id ; date
1; strelkov.av ; home_pc ; 1 ; 11:00:00
2; strelkov.av ; home_pc ; 2 ; 12:00:00
3; strelkov.av ; home_pc ; 3 ; 13:00:00
4; strelkov.av ; home_pc ; 1 ; 14:00:00


Теперь будет идти команда

insert into table (login, host, event_id, date) values ('strelkov.av', 'home_pc', '1', now());


И суть такая, что по идее в разрезе логина - strelkov.av и хоста - home_pc, последняя запись в таблице итак уже имеет event_id, то в данном случае нужно пропустить insert и не делать его
Т.е. при вставке нового значения, сначала проверить по таким же данным login и host если последняя запись с таким же event_id что и новая вставляемая то не делать insert
если же последняя запись имеет другой event_id то можно смело новую запись вставлять

Вопрос, можно ли это как то хитро в запрос подставить логику, или же это нужно отдельно процедурой, или на стороне клиента сначала проверку сделать
  • Вопрос задан
  • 317 просмотров
Пригласить эксперта
Ответы на вопрос 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
INSERT INTO my_table (login, host, event_id) 
SELECT 'strelkov.av', 'home_pc', 1
FROM my_table
WHERE login='strelkov.av' 
AND host='home_pc'
AND event_id=1
HAVING COUNT(*)=0;

Обратите внимание, что значения login, host и event_id вам в 2х местах надо указывать. Работает это дело так - если конструкция SELECT ... HAVING COUNT(*)=0 вернет true (то есть SELECT не нашел записи с таким логином, хостом и ID ивента), то будет выполнен INSERT. Если же SELECT вернет false (COUNT не равен 0, значит такая строка уже существует), то INSERT будет проигнорирован целиком. Понимаю, что это не сразу вкуривается, но SQL штука интересная :)

PS: Подразумевается, что id у вас AUTO_INCREMENT, а у date DEFAULT NOW() и их передавать вообще не надо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы