«ВСТАВИТЬ ГДЕ НЕ СУЩЕСТВУЕТ» - работает на локальном (5.6.35), но не на сервере (5.7.22) - ошибки не отображаются

0

У меня есть следующий SQL Query/Statement:

INSERT INTO 'tags' ('tag') SELECT 'water' FROM tags WHERE NOT EXISTS (SELECT id FROM 'tags' WHERE 'tag'='water') LIMIT 1

Структура таблицы имеет всего 2 столбца (id, tag).

Функцией SQL-операторов является получение тега, в том случае, когда он получает water, он проверяет, существует ли тег уже. Если тег уже существует, он должен вернуть 0 результатов. Если он не существует, он должен создать новую строку с тегом.

В настоящее время он работает только на моем локальном сервере MAMP, который запускает MySQL версии 5.6.35). Я тестировал две другие версии MySQL: 5.6.39-log и 5.7.22... и никто из них, похоже, не работает.

Единственное, что проявляется в отображаемых ошибках, - это до того, как я запустил запрос: Изображение 174551

Однако запуск выполняется не с ошибкой, а с зеленым ящиком, содержащим 0 rows inserted. (Query took 0.0014 seconds.) 0 rows inserted. (Query took 0.0014 seconds.)

Изменен синтаксис? Если да, может кто-нибудь указать мне на какую-либо документацию? Весь день я разбирал документацию.

Теги:
phpmyadmin

1 ответ

1
Лучший ответ

Ваша вставка, кажется, работает до тех пор, пока есть хотя бы какая-то другая строка на столе. Если таблица пуста, вставка не выполняется.

create table tags(id integer, tag varchar(255));
commit;

insert into tags (tag) values('xxxx');
COMMIT;

INSERT INTO 'tags' ('tag') SELECT 'water' FROM tags WHERE NOT EXISTS (SELECT id FROM 'tags' WHERE 'tag'='water') LIMIT 1;
COMMIT;

select * from tags

Он возвращает 2 строки (xxxx и water). Однако, если я удаляю INSERT xxxx, тогда ничего не вставлено и, следовательно, ничего не возвращается.

Посмотреть здесь. Вы можете попробовать с различными версиями mysql. Кажется, что это происходит одинаково во всех версиях

Я считаю, что более простой альтернативой является использование INSERT IGNORE.

https://www.db-fiddle.com/f/aDZpjz3K1L15bc69bUDkEz/0

insert ignore into tags  values(1,'xxxx');
insert ignore into tags  values(1,'xxxx');
insert ignore into tags  values(1,'xxxx');

insert ignore into tags  values(2,'water');
insert ignore into tags  values(2,'water');
insert ignore into tags  values(2,'water');

Если вы используете модификатор IGNORE, ошибки, возникающие при выполнении инструкции INSERT, игнорируются. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или PRIMARY KEY в таблице, вызывает ошибку с дубликат-ключом, и оператор прерывается. С IGNORE строка отбрасывается и ошибок не возникает. Игнорируемые ошибки генерируют предупреждения.

https://dev.mysql.com/doc/refman/8.0/en/insert.html

  • 0
    Хм, супер странно, что это не работает на пустом столе! Но могу подтвердить, что это была проблема. Кажется, оператор INSERT IGNORE просто вставляет его как новую строку, независимо от того, существует она или нет. Я отметил ваш ответ как правильный, поскольку он решил проблему в моем вопросе.
  • 0
    Да, довольно странно. Хотя я нашел корень проблемы, я все еще не могу понять этот дизайн (возможно, ошибка?). INSERT IGNORE должен «работать» (не допускать дублирования), пока в таблице есть первичный и / или уникальный индекс
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню