MySQL,是否可以防止两个字段为NULL 或NOT NULL?

MySQL, possible to prevent two fields to be NULL or NOT NULL?

一个简单的table:

ID, NAME, POST_ID, GROUP_ID

必须设置 POST_ID 或 GROUP_ID,但绝不能同时设置两者,也不能设置 none。所以,

有有效案例:

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

能设置这么复杂的限制规则吗?

您可以在创建 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)
);

您必须在 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 的版本略微更改语法。