【问题标题】:MariaDB shows warnings instead of errorsMariaDB 显示警告而不是错误
【发布时间】:2021-11-24 22:18:32
【问题描述】:

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 warnings\G
*************************** 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)

如果约束失败,我预计会出现错误。事实上,它曾经是,但不是现在。如何启用错误而不是警告?

在 Google 上搜索 SQL_MODE 并尝试了不同的组合,但没有成功:

MariaDB [kite]> SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE\G
*************************** 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 关键字中。如果我删除 - 它会按预期工作。

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    如果您想要错误而不是警告,请不要使用ignore

    https://mariadb.com/kb/en/insert-ignore/ 说:

    通过使用 IGNORE 关键字,所有错误都将转换为警告,这不会停止插入其他行。

    【讨论】:

    • 但我需要使用ignore 关键字来避免重复。在 postgres 我可以做on conflict do nothing.
    • 那么享受你的警告而不是错误吧。这就是ignore 所做的。
    • 奇怪的是,ignore 关键字有双重含义:忽略错误并用作on conflict do nothing
    • 文档很清楚:“所有错误都转换为警告。”如果您想以不同的方式处理每种类型的错误,请在不使用ignore 的情况下运行,并在代码中自己处理错误。
    • @KirillZhirnov “逻辑”很简单——无论是否出错。 IGNORE 将所有错误转换为警告。如果您只想忽略重复错误,请使用 INSERT .. ON DUPLICATE KEY UPDATE,它类似于 PostgreSQL 中的 ON CONFLCT。 dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
    猜你喜欢
    • 2023-03-14
    • 2011-06-22
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2011-02-01
    • 2017-10-03
    • 1970-01-01
    相关资源
    最近更新 更多