sql - 我创建了这个 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 语句。为什么没有呢?
解决方案
不需要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)
)
推荐阅读
- python - Python Flask App - 上传图片并显示
- mongodb - MongoDB java驱动程序最新版本(4.1.0)在maven repo中不可用
- angular - Angular 10 仅生成 es2015 文件
- matlab - 使用 Epoch 秒作为 X 轴值时,如何格式化 X 轴刻度标签?
- go - 需要帮助了解 go-shadowsocks2 中的此中继功能
- mysql - 如何将 sql 转储导入 mysql 数据库
- laravel - 如何在laravel中的视图内显示数组值
- node.js - 我该如何解决这个问题,res.json 不是函数
- java - 纸牌游戏规则:从一副纸牌中抽出手牌(没有小丑)。仅在有牌时打牌
- ruby-on-rails - 从 RDS 导出数据库,然后创建 postgres 数据库的本地副本