У меня есть следующий 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... и никто из них, похоже, не работает.
Единственное, что проявляется в отображаемых ошибках, - это до того, как я запустил запрос:
Однако запуск выполняется не с ошибкой, а с зеленым ящиком, содержащим 0 rows inserted. (Query took 0.0014 seconds.)
0 rows inserted. (Query took 0.0014 seconds.)
Изменен синтаксис? Если да, может кто-нибудь указать мне на какую-либо документацию? Весь день я разбирал документацию.
Ваша вставка, кажется, работает до тех пор, пока есть хотя бы какая-то другая строка на столе. Если таблица пуста, вставка не выполняется.
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 строка отбрасывается и ошибок не возникает. Игнорируемые ошибки генерируют предупреждения.
INSERT IGNORE
просто вставляет его как новую строку, независимо от того, существует она или нет. Я отметил ваш ответ как правильный, поскольку он решил проблему в моем вопросе.