You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:52:41