MariaDB показывает предупреждения вместо ошибок

#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 ключевое слово имеет двойное значение: игнорирование ошибок и использование as on conflict do nothing .

4. В документации ясно сказано: «все ошибки преобразуются в предупреждения». Если вы хотите обрабатывать каждый тип ошибок по-разному, затем запустите без ignore и обработайте ошибки в коде самостоятельно.

5. @KirillZhirnov «Логика» проста — либо ошибка, либо нет. IGNORE преобразует все ошибки в предупреждения. Если вы хотите, чтобы игнорировались только ошибки дублирования, используйте ВСТАВКУ .. ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА, которое является аналогом ON CONFILCT в PostgreSQL. dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html