【问题标题】:MySQL, possible to prevent two fields to be NULL or NOT NULL?MySQL,可以防止两个字段为 NULL 或 NOT NULL?
【发布时间】:2019-02-05 09:49:59
【问题描述】:

一个简单的表格:

ID, NAME, POST_ID, GROUP_ID

POST_ID 或 GROUP_ID 都必须设置,但绝对不能同时设置,任何一个都不能。所以,

有有效的案例:

ID, NAME, POST_ID, GROUP_ID
x,   y,   1,       NULL
x,   y,   NULL,    4

和无效的情况:

ID, NAME, POST_ID, GROUP_ID
x,   y,   NULL,    NULL
x,   y,   4,       4

这样复杂的限制规则可以设置吗?

【问题讨论】:

  • MySQL 不支持check 约束,因此必须使用触发器来实现。

标签: mysql sql foreign-keys restriction


【解决方案1】:

您必须在 CREATE 和 UPDATE 事件上使用 TRIGGERS,并在条件 (COALESCE(POST_ID, GROUP_ID) IS NULL OR (POST_ID IS NOT NULL AND GROUP_ID IS NOT NULL)) 发生时抛出异常

这里是您问题的答案: Either OR non-null constraints in MySQL

这是程序,根据MySql的版本稍微改变语法。

【讨论】:

    【解决方案2】:

    您可以在创建 TABLE 时使用CHECK 约束:

    CREATE TABLE Persons (
        ID int NOT NULL,
        NAME varchar(255) NOT NULL,
        POST_ID int,
        GROUP_ID int,
        CHECK (POST_ID IS NULL XOR GROUP_ID IS NULL)
    );
    

    【讨论】:

    • 这个没有效果,仍然可以添加无效记录。甚至没有看到它的“SHOW CREATE TABLE”命令
    • CHECK 约束从 MySQL 8.0.16 开始生效。 dev.mysql.com/doc/refman/8.0/en/…
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2013-04-18
    相关资源
    最近更新 更多