如何用单条SQL语句实现8列互不相等的表约束?
解决多列值互不相等的约束创建问题
你原来的SQL语句无法生效,核心原因是<>是二元运算符,只能比较左右两个值,连续使用会产生逻辑错误(比如col_1 <> col_2 <> col_3实际是判断(col_1 <> col_2)的布尔结果和col_3是否相等,而非三者两两不等)。
通用兼容方案(适用于所有支持CHECK约束的数据库)
直接列出所有两两列的不等条件,用AND连接,这是最稳妥的写法:
ALTER TABLE mytable ADD CONSTRAINT no_duplicate_values CHECK ( col_1 <> col_2 AND col_1 <> col_3 AND col_1 <> col_4 AND col_1 <> col_5 AND col_1 <> col_6 AND col_1 <> col_7 AND col_1 <> col_8 AND col_2 <> col_3 AND col_2 <> col_4 AND col_2 <> col_5 AND col_2 <> col_6 AND col_2 <> col_7 AND col_2 <> col_8 AND col_3 <> col_4 AND col_3 <> col_5 AND col_3 <> col_6 AND col_3 <> col_7 AND col_3 <> col_8 AND col_4 <> col_5 AND col_4 <> col_6 AND col_4 <> col_7 AND col_4 <> col_8 AND col_5 <> col_6 AND col_5 <> col_7 AND col_5 <> col_8 AND col_6 <> col_7 AND col_6 <> col_8 AND col_7 <> col_8 );
简洁优化方案(仅适用于PostgreSQL等支持数组函数的数据库)
通过对比数组去重前后的长度,实现更简洁的约束逻辑:
ALTER TABLE mytable ADD CONSTRAINT no_duplicate_values CHECK ( cardinality(ARRAY[col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8]) = cardinality(ARRAY(SELECT DISTINCT unnest(ARRAY[col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8]))) );
注意:MySQL 8.0.16之前的版本不支持CHECK约束的实际生效,若使用这类版本,需要通过触发器实现相同逻辑。
内容的提问来源于stack exchange,提问作者Edgar Derby
相关产品推荐
相关产品推荐

