sql中check怎么用 CHECK约束验证数据的3个实例

你好,你问我 CHECK 约束是什么?上周一位客户问我如何使用数据库,所以我告诉了他。
请听。

上周有客户问我,公司有新制度,希望保证员工年龄在1 8 岁到6 5 岁之间。
他们不能只填上1 5 、7 0岁就出去乱搞。
我当时给他演示了CHECK约束,非常简单。

例如,在示例 1 中,您希望将员工表中的年龄字段限制在 1 8 岁到 6 5 岁之间。
创建表时可以直接添加:
sql 创建表员工( EmployeeID INT 主键, 名字 VARCHAR(5 0), 姓氏 VARCHAR(5 0), 年龄综合检查(年龄 >= 1 8 岁且年龄 <= 6 5 ) );
你看,语句CHECK(Age >= 1 8 AND Age <= 6 5 )保证了如果你想向Age插入数据,就必须满足这个条件。
如果有人想插入 1 6 年前的帖子:
sql INSERT INTO 员工 (employeeID、名字、姓氏、年龄) VALUES (1 , 'John', 'Doe', 1 6 );
会直接报错,屏幕会显示:“CHECK约束违规”。
谁让你加个不合理的年龄了?
后来他又问我,如果我已经设置了手表,现在却发现忘记添加年龄限制了,怎么办?这也很简单,只需使用ALTER TABLE添加约束即可:
sql ALTER TABLE 员工添加约束 CK_EmployeeAge CHECK(年龄 >= 1 8 且年龄 <= 6 5 );
你看,添加了一个约束名称CK_EmployeeAge之后,稍后你就知道它是哪个约束了。

例如示例 2 ,“产品”表中的“类别”字段只能具有三个值:“电子产品”、“服装”和“家居用品”。
创建表时可以输入:
sql 创建表产品( ProductID INT 主键, 产品名称 VARCHAR(1 00), 类别 VARCHAR(5 0) CHECK(类别 IN(“电子产品”、“服装”、“家居用品”)) );
如果有人想在category中插入'Computers',会立即报错:
sql 插入产品(产品 ID、产品名称、类别)值(1 、“笔记本电脑”、“计算机”);
“检查约束违规”,你看,连‘电脑’都不准进来,制度这么严格。

例3 就更好了,订单表中的交货日期必须晚于或等于订单日期。
创建表时:
sql 创建表订单( 订单 ID INT 主键, 订单日期DATE, 发货日期 CHECK DATE(发货日期 >= 订单日期) );
这就涉及到跨列验证,保证发货日期不早于订单日期,逻辑上是正确的。
如果有人敢插入一条交货日期早于OrderDate的记录:
sql 插入订单(订单 ID、订单日期、发货日期)值 (1 、'2 02 3 -01 -01 '、'2 02 2 -1 2 -3 1 ');
同样,如果“违反了 CHECK 约束”,数据库本身会为您停止它。

总结关键操作:
建表时添加约束:CHECK(条件表达式) 更改表时添加约束: ALTER TABLE 表名 ADD CONSTRAINT 约束名称 CHECK(条件表达式)
约束处理:
禁用: ALTER TABLE 表名称 NOCHECK CONSTRAINT 约束名称 激活: ALTER TABLE 表名 CHECK CONSTRAINT 约束名 删除: ALTER TABLE table-name DROP CONSTRAINTconstraint-name
适用场景及好处:
适合简单的行级验证,例如年龄范围、字段值约束、跨列逻辑等。
性能优于触发器且维护方便。
直接集成到表结构中,无需编写额外的代码。

但是也有局限性:
它不支持复杂的逻辑,例如交叉表验证,这需要使用触发器。
复杂的表达式会影响性能,所以需要优化条件或者添加索引什么的。

无论如何,这取决于你。
如果CHECK约束用得好,数据的完整性就能得到保证,可以省去很多麻烦。
我还在思考一个问题,就是如果条件表达式特别复杂的话,数据库会不会卡住?这需要进一步研究。

SQLServer中的check约束

那天上班,我正在帮同事调试数据库表,突然他说:“哎,这个表的时间字段好像有问题。
”经审查,我发现他写的SQL脚本中,“上机时间”和“下机时间”颠倒了。
他最初想添加一个约束,以确保“下机时间”始终晚于“登机时间”,但他最终写道“下机时间”必须早于“登机时间”。
这让我想起,有时我们太急于完成一项任务,以至于忽略了一些细节。
比如这张表是2 02 3 年5 月1 0日创建的,当时他正在喝咖啡敲代码,根本没有注意到这个逻辑错误。
我帮他用MySQL数据库改了。
更改SQL语句后,表恢复正常。
等等,还有别的事。
我突然想到,如果他没有及时发现这个问题,插入数据的时候会不会出错呢?