首页 > 解决方案 > 我创建了这个 CHECK 约束来保证 4 个字段中的至少 2 个在一个条目中是等效的。为什么它不起作用?

问题描述

我正在尝试创建一个约束来强制每一行具有四个字段中的至少两个彼此等效。

我想出了

    CHECK(
    (CASE WHEN (CAMPO1=CAMPO2)
    OR (CAMPO1=CAMPO3)
    OR (CAMPO1=CAMPO4) 
    OR (CAMPO2=CAMPO3)
    OR (CAMPO2=CAMPO4)
    OR (CAMPO3 = CAMPO4)
    THEN 1 END) = 1 );

然而,令我惊讶的是,下面的 INSERT 语句通过了。

INSERT INTO Ejercicio2A_2(
    CAMPO1,
    CAMPO2,
    CAMPO3,
    CAMPO4)
VALUES('A','B','C','D')

没有一个值等于另一个,所以我需要约束来拒绝 INSERT 语句。为什么没有呢?

标签: sqlsql-server

解决方案


不需要case表达式:

(CAMPO1 = CAMPO2 OR CAMPO1 = CAMPO3 OR CAMPO1 = CAMPO4 OR
 CAMPO2 = CAMPO3 OR CAMPO2 = CAMPO4 OR
 CAMPO3 = CAMPO4
)

或者更简洁地说:

(CAMPO1 IN (CAMPO2, CAMPO3, CAMPO4) OR
 CAMPO2 IN (CAMPO3, CAMPO4) OR
 CAMPO3 IN (CAMPO4)
)

推荐阅读