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

说实话,当我在论坛上帮助人们解决MySQL约束问题时,我发现很多初学者都面临与这个问题相关的陷阱。
例如,我的朋友直接为数据经常变化的user_status字段添加了唯一约束。
结果每次更新用户状态都会发生崩溃。
这是典型的缺乏经验。
后来我向他解释说,当MySQL创建唯一索引时,它与常规索引的B+树结构不同。
为了加快重复值的搜索速度,您需要维护一个额外的哈希表。
我没有直接运行这方面的底层源代码,但我认为内存消耗会变得更加明显。

有趣的是,当我第一次使用 ALTER TABLE ADD CONSTRAINT 向旧表添加唯一约束时,我几乎被 MySQL 的错误消息愚弄了。
当时该表已经有一个名为Username的字段,并且数据中仍然存在重复的名称。
运行直接报错“重复按键输入”。
后来我记得切换到 ALTER TABLE users ADD UNIQUE(username) DEFAULT CHARSET=utf8 mb4 ,然后使用 SELECT username, COUNT() FROM users GROUP BY username HAVING count > 1 首先检查重复项。
这个技巧现在是初学者必须教的。
这真的很容易。

我在给药品命名时有一些习惯。
例如,要将订单号 + 客户 ID 的唯一约束添加到订单表中,通常可以编写 ALTERTABLE order ADD CONSTRAINT uc_order_customer UNIQUE(order_id, customer_id)。
这种带有商业意义的命名比MySQL自动生成的k_XXXX更可靠。
我们的客户就用了这个方法:后来他的数据导入脚本偶尔报错。
经过检查,发现自动生成的索引名与特定的系统表冲突。

表演其实很有趣。
在调整电子商务系统时,我们发现我们的表有数百个列,每个列都添加了自己的约束。
结果,CPU峰值飙升至2 00%。
随后的分析表明,该列有很多并发写入,每次插入数据时MySQL都必须重建其哈希表。
说白了,就是需要对刀刃进行约束。
有一个表建议将 Unique(order_id, Payment_method) 更改为 Unique(order_id)。
因为后者覆盖率太大,影响性能。

最常用的调试技术是事务回滚。
例如,如果你的表结构非常复杂,想要添加复合唯一约束,首先执行 START TRANSACTION,然后 ALTERTABLE add CONSTRAINT uc_new_unique...,如果报错则执行 ROLLBACK。
一个新手问我为什么这么麻烦,我告诉他我只是想给自己保险,万一出了什么问题可以立即取消。
最令人惊讶的是,我有一个场景,表有数百万条数据,我手动添加了一个约束,锁定表2 个小时。
最后我改用批量插入+先建临时索引再替换,时间缩短到了1 0分钟。
它已被缩短。

最后,有一点琐事:MySQL 实际上从 5 .7 开始就支持一些独特的约束。
ALTERTABLE USER ADD CONSTRAINT uc_partial UNIQUE(username) WHERE is_active = 1 ,因此仅限制正常状态下的用户名。
有一个旅行系统效果特别好。
访客帐户和会员帐户使用相同的表,但只有会员帐户受到唯一限制。
但现在使用这个功能的人并不多。
是否适合您取决于您​​的业务场景。

删除mysql索引

索引删除的需求:优化存储,提高更新效率。
重复索引案例:在电商订单表中,订单ID已经是主键,额外的订单ID索引是没有用的。
删除常规索引: ALTER TABLE order DROP INDEX idx_order_id; 删除主键索引:确保不存在外键依赖关系后,在 ALTER TABLE 中执行 DROP PRIMARY KEY 命令。
删除phpMyAdmin:检查索引并点击“删除”。
需求评估:有助于分析订单状态指标、低频查询等。
数据备份:操作前备份表结构,以防万一。
监控变化:观察删除后的慢查询日志。
批量删除:不要一次删除多个索引,而是批量测试。
你自己掂量一下。

MySQL数据库中的unique索引:用法与注意事项

我们来谈谈 MySQL 的事情。
说到唯一索引,这是数据库中非常重要的一个东西。
说实话,我在教初学者如何使用的时候,常常要讲解如何使用,需要注意什么。

首先你应该知道,Unique索引是用来保证表中的一列,甚至是多列的组合是唯一的。
让我们举个例子。
例如,用户表通常有一个电子邮件地址字段。
为了防止两个用户使用相同的电子邮件地址,将为该电子邮件地址创建唯一索引。

创建唯一索引的语法如下: CREATE UNIQUE INDEX INDEX_Name ON table_name(column_name);其中index_name是索引的名称,table_name是表的名称,column_name是要在其上创建索引的列的名称。
例如,我创建了一个名为 users 的表,其中有一个电子邮件字段。
我想为此字段创建一个名为 unique_email 的唯一索引。
代码是这样写的:
sql 创建表用户(id INT NOT NULL AUTO_INCRMENT,用户名 VARCHAR(5 0) NOT NULL,电子邮件 VARCHAR(5 0) NOT NULL,INDEX UNIQUE unique_mail(email));
然后,在使用唯一索引时,您应该注意到,当表中已经存在唯一索引的列的值并且您将相同的值插入其中后,MySQL会弹出并告诉您“唯一约束错误”。

例如,如果 user1 @example.com 已在电子邮件列中,则可以运行:
sql INSERT INTO 用户(用户名、电子邮件)值 ('user1 ', 'user1 @example.com');
这时,数据库会向你抛出一个错误,告诉你这个电子邮件地址已被某人使用。

另一个需要注意的是,您可以创建共享唯一索引,这意味着多个列的组合值必须是唯一的。
如果要删除唯一索引,可以使用 DROP INDEX 语句。

在设计数据库时,应根据业务需求决定是否使用唯一索引。
可能有点极端,但我不得不说,如果使用不当,唯一索引有时会成为性能瓶颈。

最后,使用唯一索引可以保证数据的完整性和一致性,这在数据库设计中非常重要。
对于我教的许多初学者来说,通过正确使用唯一索引可以极大地提高数据库性能和数据质量。
所以,这个东西你应该会用,也应该考虑一下现在的情况。
我对此只知道这么多。
我记得数据上是这么说的,但我建议你自己实践一下。