Вставка MySQL там, где ее нет, не работает

#mysql

Вопрос:

Я пытаюсь выполнить запрос на вставку MySQL, только если он еще не существует. Вот как я пытаюсь это сделать, но это не работает. Что я делаю не так?

 INSERT INTO user_logs (log_date, log_ip, name) VALUES ('2021-09-13 00:00:00', '192.168.0.1', 'Bob') 
WHERE NOT EXISTS (SELECT * FROM user_logs WHERE log_ip='192.168.0.1' AND name='Bob') 
 

Комментарии:

1. да, поскольку у вставок нет класса where

Ответ №1:

если log_ip и имя УНИКАЛЬНЫ, вы можете использовать их ПРИ ОБНОВЛЕНИИ ДУБЛИКАТОВ

Это приведет к обновлению столбца log_date, если имя и log_ip будут одинаковыми

 INSERT INTO user_logs (log_date, log_ip, name) VALUES ('2021-09-13 00:00:00', '192.168.0.1', 'Bob') 
ON DUPLICATE KEY UPDATE
  log_date = VALUES(log_date),log_ip = VALUES(log_ip), name = VAUES(name) ;
 

Ответ №2:

Вы не можете использовать WHERE предложение в INSERT заявлении. Однако вы можете использовать SELECT оператор внутри INSERT , который позволит вам использовать WHERE условное условие.

 INSERT INTO user_logs (log_date, log_ip, name) 
SELECT '2021-09-13 00:00:00', '192.168.0.1', 'Bob'
WHERE NOT EXISTS (SELECT * FROM user_logs WHERE log_ip = '192.168.0.1' AND name = 'Bob');
 

Изменить: Я включил ниже инструкции по тестированию и вывод консоли, чтобы продемонстрировать это решение.

 mysql> CREATE TABLE user_logs (
    ->     log_date TIMESTAMP,
    ->     log_ip VARCHAR(200),
    ->     name VARCHAR(200)
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql> INSERT INTO user_logs (log_date, log_ip, name) VALUES
    -> ('2021-09-11 00:00:00', '192.168.0.1', 'Bob'),
    -> ('2021-09-12 00:00:00', '192.168.0.2', 'Mary'),
    -> ('2021-09-13 00:00:00', '192.168.0.3', 'Tom');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO user_logs (log_date, log_ip, name) 
    -> SELECT '2021-09-14 00:00:00', '192.168.0.4', 'John'
    -> WHERE NOT EXISTS (SELECT * FROM user_logs WHERE log_ip = '192.168.0.4' AND name = 'John');
Query OK, 1 row affected (0.05 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> INSERT INTO user_logs (log_date, log_ip, name) 
    -> SELECT '2021-09-13 00:00:00', '192.168.0.3', 'Tom'
    -> WHERE NOT EXISTS (SELECT * FROM user_logs WHERE log_ip = '192.168.0.3' AND name = 'Tom');
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
 

Комментарии:

1. Только что попробовал это, но я получаю сообщение об ошибке СИНТАКСИЧЕСКОЙ ошибки в строке, которая читается ТАМ, ГДЕ ЕЕ НЕТ

2. Эта строка скопирована из вашего запроса, и полный оператор работает при тестировании с моей стороны. Я отредактирую свой ответ с выводами консоли, чтобы помочь вам устранить неполадки.