#mysql #mariadb
Вопрос:
Версия MariaDB: 10.6.4-MariaDB-1:10.6.4 maria~focal
SQL:
insert ignore into `step` (is_draft, created_by) values ('1', 2);
Получил предупреждения:
MariaDB [kite]> show warningsG
*************************** 1. row ***************************
Level: Warning
Code: 1364
Message: Field 'course_id' doesn't have a default value
*************************** 2. row ***************************
Level: Warning
Code: 1364
Message: Field 'title' doesn't have a default value
*************************** 3. row ***************************
Level: Warning
Code: 1452
Message: Cannot add or update a child row: a foreign key constraint fails (`kite`.`step`, CONSTRAINT `step_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`course_id`) ON DELETE CASCADE ON UPDATE CASCADE)
3 rows in set (0.000 sec)
Я ожидаю, что в случае сбоя ограничения возникнет ошибка. На самом деле, так было раньше, но не сейчас. Как включить ошибки вместо предупреждений?
Погуглил о SQL_MODE и попробовал разные комбинации, но безуспешно:
MariaDB [kite]> SELECT @@SQL_MODE, @@GLOBAL.SQL_MODEG
*************************** 1. row ***************************
@@SQL_MODE: STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
@@GLOBAL.SQL_MODE: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Заранее спасибо!
ОБНОВЛЕНИЕ: Похоже, проблема в ignore
ключевом слове. Если я удалю — это сработает, как и ожидалось.
Ответ №1:
Если вам нужны ошибки вместо предупреждений, то не используйте ignore
.
https://mariadb.com/kb/en/insert-ignore/ говорит:
С помощью
IGNORE
ключевого слова все ошибки преобразуются в предупреждения, что не остановит вставку дополнительных строк.
Комментарии:
1. Но мне нужно использовать
ignore
ключевое слово, чтобы избежать дублирования. В постгресе я могу это сделатьon conflict do nothing
.2. Что ж, тогда наслаждайтесь своими предупреждениями, а не ошибками. Вот что
ignore
делает.3. Странно, что
ignore
ключевое слово имеет двойное значение: игнорирование ошибок и использование ason conflict do nothing
.4. В документации ясно сказано: «все ошибки преобразуются в предупреждения». Если вы хотите обрабатывать каждый тип ошибок по-разному, затем запустите без
ignore
и обработайте ошибки в коде самостоятельно.5. @KirillZhirnov «Логика» проста — либо ошибка, либо нет.
IGNORE
преобразует все ошибки в предупреждения. Если вы хотите, чтобы игнорировались только ошибки дублирования, используйте ВСТАВКУ .. ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА, которое является аналогом ON CONFILCT в PostgreSQL. dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html