MySQL中constraint的详解

说白了,MySQL中的约束就像给数据库表的列加上了一层保护层,保证数据的正确性和一致性。
其实很简单。
我们可以从以下几个关键点来理解这些约束:
首先,最重要的是主键约束(PRIMARY KEY)就像每个人的身份证号一样。
它确保表中每一行的唯一性。
一张表只能有一个主键,并且不能有重复值或NULL值。
例如,我们去年跑的项目中,我们使用学生ID作为主键,这样可以唯一地识别每个学生。

另一方面,外键约束(FOREIGN KEY)就像亲戚一样。
它们用于建立表之间的连接并确保数据的一致性。
例如,在Orders 表中,Product ID 和Customer ID 用作外键,它们必须引用Product 表和Customer 表中的主键。
对于大约 3 ,000 个项目,外键的使用几乎是标准的。

还有一个关键细节,那就是 UNIQUE 约束,它确保列中的值是唯一的,即使它可能包含 NULL 值。
很多人都没有注意到这一点,但是这对于防止数据重复是非常有用的。

一开始我以为CHECK约束和DEFAULT约束只是锦上添花,但后来我发现这是错误的。
它们在确保数据有效性和简化数据输入方面发挥着重要作用。
CHECK约束可以自定义合法的数据范围,而DEFAULT约束可以自动填充列的默认值。

等一下,还有一个东西,就是非空约束(NOT NULL)和自增约束(AUTO_INCRMENT)。
非零约束简单粗暴,强制你在插入数据时输入一个值;自动增量约束就像一个自动计数器,它自动为每条记录生成唯一的ID。

一般来说,合理利用这些限制就像给数据库穿上了一套好的铠甲,既可以保护数据的安全,又可以提高数据库的查询效率。
我认为值得一试,看看您的数据库是否因此变得更加健壮。

mysql如何管理外键约束

让我告诉你MySQL外键。
当我2 008 年第一次开始从事数据库工作时,我真的很震惊。
如果你使用得好,外键是轻而易举的事,但如果你使用不当,它们实际上可能会冻结你的系统。

比如2 01 0年我在上海做一个项目的时候,当时的数据库表有几百张。
直接在建表语句中添加外键使代码干净且易于维护。
像这样:
sql 创建表订单( order_id 主键 INT, 用户 ID INT, 订单日期日期, 外键 (user_id) 引用 user(id) );
简单明了。
但后来发现其中一个表字段类型不对。
例如,user_id 为 INT,但用户表 id 为 VARCHAR。
这直接导致建表错误。
因此,现在在创建表之前,我习惯于浏览表结构文档。
我记得2 01 2 年有一个客户项目,因为类型不匹配,我一晚上都没睡好。

修改表并添加外键?这个操作要多加注意。
2 01 4 年在深圳遇到了一个陷阱,多次更改表结构,忘记删除剩余的外键约束。
因此,将数据导入组时系统会挂起。
最后发现有一个旧的外键没有被删除。
现在要修改表结构,我首先需要运行:
sql 选择约束_名称、表_名称 来自 information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'your_db_name';
列出所有外键名称并在继续之前确认。
这个技巧每次都有效。

外键的命名非常重要。
当时有个同事随意取了表名,所有的外键约束名都是MySQL自动生成的,比如FKusz3 c2 p0o5 e5 lq。
当他换表时,他花了两天时间寻找限制的名称。
我现在要求团队规范一下命名,比如fk_user、fk_order_items等,一目了然。

级联操作? 2 01 5 年在北京做电商项目时用过,在CASCADE DELETE中,主表user被删除,订单表user_id自动清空。
结果出现了一个没有考虑到的场景。
当用户删除订单时,订单并没有被删除,而是与该用户关联的所有订单的user_id都变成了NULL,导致下游系统出现很多错误。
这个项目花了整整一周的时间才解决。
现在在ON DELETE CASCADE中,我通常会加上一个判断:表的主记录是否真的可以安全删除。

隐藏外键?首先您需要知道约束的名称。
2 01 9 年我在杭州做系统升级,删除了旧表,改变了新表的结构。
结果发现,新表仍然保留了旧表的外键约束,数据无法同步。
我当时真的很担心。
现在,在删除外键之前,我需要运行:
sql 显示创建表,your_table_name;
在继续之前,请检查表创建语句并确认约束名称。
我记得在一个项目中,表名改变了,但外键约束名称没有相应改变。
结果整个数据同步连接崩溃了。

我最后说实话,虽然外键保证了数据的一致性,但是性能确实需要考虑。
2 01 8 年我在成都做一个高并发项目时,测试发现对于添加了外键的表,向数组插入数据时延迟会增加一倍。
当时数据库的QPS要上万,测试环境执行的时候就卡住了。
最后和架构师讨论后,一些非键表干脆用触发器来模拟外键逻辑,性能立马提升。

总的来说,并不是说外键不能使用,而是应该用在正确的地方。
如果表和关键业务关系特别强,使用外键是正确的。
但对于临时关联和大量数据,就必须考虑其他解决方案。
在过去的1 0年里,我曾陷入过陷阱。
就少走一些弯路吧。

给MySQL表添加和删除唯一约束的方法

唯一的限制是确保数据不重复。

建表时直接添加UNIQUE。
例如: sql CREATE TABLEusers(id INT AUTO_INCRMENT PRIMARY KEY, 用户名 VARCHAR(5 0) UNIQUE);
向现有表添加约束: sql ALTER TABLEusers 添加约束 uc_username UNIQUE(用户名);
要删除限制: sql 用户 ALTER TABLE DROP INDEX uc_username;
约束是使用唯一索引来实现的。
插入数据时会检查重复项。

重复值错误?首先检查是否有重复项: sql SELECT username, COUNT() AS number FROM users GROUP BY username HAVING count > 1 ;
名字冲突?不要使用现有的名称。

交易很有用: sql 开始交易; ALTER TABLE 用户添加约束 uc_username UNIQUE(用户名); 完成;
不要对经常更新的列添加太多限制。
大型表使用事务来减少锁定。

指定约束的名称,例如 uc_username。

操作前应检查数据是否重复。