mysql - 带有 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);
解决方案
使用逗号分隔的语法:
ALTER TABLE address ADD CONSTRAINT fk_account_adresses2_idx UNIQUE(account_id),
ADD CHECK (is_principal >= 1);
作为旁注,MySQL 8+ 之前版本中的检查约束将被忽略。因此,如果您使用的是早期版本的 MySQL,那么检查约束将被忽略。
推荐阅读
- ag-grid - AG 网格除显示行总计外,还显示百分比行总计
- google-cloud-platform - 创建 Bigtable 副本集群会产生度量错误
- c# - 在 IIS 上运行的 ASP.net 上的超长 TTFB
- php - 如何在 Twig 的标题下显示名称列表
- pandas - 处理`read_csv`的本地时间变化缓慢的熊猫
- ruby-on-rails - NoMethodError: nil:NilClass 的未定义方法 `<'
- opengl - GL_DEPTH_CLAMP 无效(反向 z)
- python - Django 测试用例测试模型失败
- php - 通过 php7.1 后的参数太少。3 个参数通过,4 个参数预期。动态创建图像的脚本
- postgresql - 错误:运营商不存在:没有时区的时间> = bytea