sql中constraint用途 CONSTRAINT约束的5种类型详解

嘿,你为什么不发送这条消息?我上周在帮助同事调试数据库时才发现这些。
听起来很复杂,但实际上使用起来很有趣。

主键是最简单的键,用作每条记录的ID标签。
例如,users表必须有一个唯一标识用户的ID,并且不能为空。
记得2 02 3 年在北京做项目的时候,如果一个表的多个字段要一起做主键,就得写成(id,username),而且不能分开。

外键(FORIGN KEY)在表之间建立关系,以防止命令指向不存在的用户。
我已经走进了陷阱。
2 02 2 年在上海的一个公司项目中,我忘记在外键中添加ON DELETE CASCADE。
结果,当我删除用户时,该订单变成了孤儿订单。
为了弥补这一点,我熬夜到凌晨三点。
外键确保数据之间的关联性并且不会被意外更改。

唯一约束(UNIQUE)与主键类似,但不那么严格。
例如,用户的电子邮件地址不能重复,但可以留空。
我用得最多的就是我的邮箱。
用户可以非常常见地创建(id INT PRIMARY KEY,电子邮件 VARCHAR(1 00) UNIQUE)。

检查约束 (CHECK) 旨在为数据提供一道防线。
比如订单日期不能是将来的或者分数必须在1 到5 之间。
上次在广州签到的时候忘记加CHECK约束了。
结果,用户输入了-1 的分数,系统并没有阻止它。
我真的很确信。

NOT NULL 约束是最真实的,即某个字段必须填写,不能留空。
用户名等核心信息必须为NOT NULL,否则数据将不完整。
看一下您发布的示例,用户名后跟 NOT NULL,这是标准用法。

关于命名和约束管理,虽然可以在altertable中添加和删除约束,但我基本上不使用它,因为它复杂且容易出错。
我记得2 02 3 年我在深圳做一个项目的时候,一张桌子的约束太多了。
结果在更改数据的时候不小心删除了错误的数据,导致整个数据库瘫痪。
那段日子压力很大。

必须注意对性能的影响。
真正的约束会比较慢,尤其是复杂的CHECK。
我有一个朋友在做2 02 2 年杭州的一个大数据系统,因为他加了太多CHECK约束,直接插入数据就卡住了。
最后,他必须添加缓冲才能度过难关。
实在是让人哭笑不得。

总之,约束的使用要看情况。
必须使用核心数据,必须使用关系字段,其他字段根据业务需要。
不要把简单的问题复杂化。
一对当没有限制时它会更快。
不管怎样,你明白了,我还在考虑这个问题。

数据库:第九章(约束)

哎,说到缺少数据库,这个事情需要详细解释一下。
记得有一次,我在做项目的时候,遇到了零约束的问题。
当时我在MySQL数据库中添加了一些字段,并设置了notnull约束,也就是说那些字段不能为空。
结果运行代码后发现有些字段可能还是空白。
即使当时我也很困惑。

经过调查,发现sql_mode系统变量导致了问题。
MySQL 中的这个变量控制数据库的行为,例如是否允许某些 SQL 语句。
为了解决notnull约束失败的问题,我需要临时调整这个sql_mode,或者修改配置文件,让客户端默认使用正确的设置。

还有一次,我在设置一个用户表,性别字段经常是男孩,所以我想为其设置一个默认值,但MySQL给我带来了一些麻烦。
默认值必须显式指定,否则可能什么都不填,所以要小心。

谈论 auto_increment,这并不是什么新鲜事,尤其是在生成 ID 时。
例如,如果创建一个表并将ID列设置为auto_increment,则每次插入新行时ID都会自动递增,这非常方便。

不过约束有一些不寻常的设置,比如修改自增ID的初始值和步长,在某些情况下还是很有用的。
还有会话级和全局级设置。
这些交互规则有点复杂,需要仔细研究。

那么这些就是主要的障碍。
主键和唯一约束保证数据的唯一性,而外键保证表之间关系的正确性。
一张表只能有一个主键,但可以有多个唯一约束。
复合唯一性是多个字段的组合,以确保唯一性。

理解这些约束对于执行数据查询和维护数据库结构确实很有帮助。
之前我并没有这么系统地学习过。
每当我遇到问题时,我总是留意它们。
现在看来我需要花更多的时间来巩固这些知识点。