首页 > 解决方案 > 带有 UNIQUE 和 CHECK 的 SQL 约束

问题描述

我的目标是防止插入如果“地址”与“is_principal”具有相同的“account_id”为真(我只需要一个 is_principal 地址)。

有没有办法用 UNIQUE 和 CHECK 创建 SQL 约束?

我试试这个:

ALTER TABLE address ADD CONSTRAINT fk_account_adresses2_idx UNIQUE(account_id, CHECK (is_principal >= 1)); 

错误 :

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHECK (is_principal >= 1))' at line 1 (SQL: ALTER TABLE address ADD CONSTRAINT fk_compte_adresses2_idx UNIQUE(account_id, CHECK (is_principal >= 1));)

谢谢。

编辑 :

插入应该工作的例子:

insert into `address` (`address`, `account_id`, `is_principal`) values (address 1, 1, 1);
insert into `address` (`address`, `account_id`, `is_principal`) values (address 2, 1, 0);
insert into `address` (`address`, `account_id`, `is_principal`) values (address 3, 1, 0);

插入应该失败的例子:

insert into `address` (`address`, `account_id`, `is_principal`) values (address 1, 1, 1);
insert into `address` (`address`, `account_id`, `is_principal`) values (address 2, 1, 1);

标签: mysqlconstraintsuniqueddl

解决方案


使用逗号分隔的语法:

ALTER TABLE address ADD CONSTRAINT fk_account_adresses2_idx UNIQUE(account_id),
                    ADD CHECK (is_principal >= 1);

作为旁注,MySQL 8+ 之前版本中的检查约束将被忽略。因此,如果您使用的是早期版本的 MySQL,那么检查约束将被忽略。


推荐阅读