MySQL表添加了一个字段,竟然导致数据无法写入,反思

我最近陷入了困境,我需要和你谈谈。
去年年底,我在项目中创建了一个MySQL表,并添加了一个新字段。
结果就是根本无法写入数据。
我的头快要爆炸了。

事情是这样的。
原来该表有一个名为 idx_day_netid 的复合索引,其中包含字段(day、kind、netid、item)。
该索引是唯一索引。
它可能会被意外地用作业务中的唯一密钥。
后来查了一下,果然索引隐含了一个唯一约束。

然后,我想在字段中添加一个新房间,但结果很悲惨。
我尝试输入两次但无法写入数据。
第一条数据写入了,但是第二条数据卡住了。
我查了一下,发现两条数据(day、type、netid、item)的组合值是一样的。
虽然房间数值不同,但由于该指标的限制,无法录入第二条数据。

当时的情况简直太糟糕了。
后来我分析,原来是索引设计的问题。
添加新的场室后,忘记调整索引结构,导致了唯一的冲突。

查了资料,发现这个问题还挺普遍的。
主要问题是索引类型的误用和索引扩展性不足。
在我的表中,添加fieldroom后,索引没有水平扩展,从而导致了唯一冲突。

我最后是怎么解决的?重建一个非唯一索引并将其更改为(天、网络、房间),从而解决了问题。
该索引不仅支持从新维度房间进行查询,而且消除了唯一性冲突,允许重复数据(日期、类型、网络、项目)但进入不同的房间。

我从中学到了很多东西。
以后在设计索引的时候,我应该更加谨慎,根据业务需求动态调整,避免死板地使用唯一约束。
还必须加强沟通,以确保需求得到准确理解。
技术解决方案还应考虑短期修复和长期维护,例如推广自动化工具来覆盖索引变化场景。
这次我陷入了一个大坑,但我想我吸取了教训。
呵呵,说完心里舒服多了。

mysql我想添加一个字段,然后将这个字段和原表中的字段一起作为联合主键,应该怎么写SQL语句,正确再发答案

说实话,你还记得这条SQL语句。
当我第一次接手这个项目时,我对错误日志感到困惑。
后来发现ALTER TABLE操作其实并没有那么复杂。
说说我记得最清楚的一次吧。
一位老人把农场的名字倒写了。
结果,整个表中的数据变得不对齐。
我整个晚上都没有睡好。

添加栏 这部分没有问题。
例如,我之前在做一个电商系统的时候,需要在Users表中添加一个登录IP字段。
只需使用: SQL ALTER TABLE tblUsers ADD COLUMN LastLoginIP VARCHAR(4 5 );
选择VARCHAR(4 5 )是因为ISP指定的IP范围可以有子网掩码,4 5 位就足够了。
这个长度我测试了好几次。
如果超过这个长度,就会被截断。
后来我写了一个测试脚本,反复插入1 9 2 .1 6 8 .1 .x范围内的IP才最终确定。

就 ADDPRIMARYKEY 而言,您确实需要确保该字段可以唯一标识一条记录。
我有一次奇怪的经历。
我向历史订单表添加了主键。
本来想用订单号,但是几个月前发现系统有bug,订单号增加了三个。
最后只能加上一个自增隐藏ID,当时真是头疼。
现在想来,我应该早点做一下数据审核。

但是你说没有主键的话会很简单,但是有主键的话就很简单会很混乱。
这是绝对正确的。
上次帮朋友调整表结构的时候,他的表居然有五个候选键,着实让我吃惊。
说白了就是主键设计乱了,后续的表修改就像拆炸弹一样。
我个人没有在这个字段做过复杂的主键修改,但是听说使用ALTER TABLE ADD PRIMARY KEY时,如果有数据违反唯一性约束,就会报错。
这个逻辑应该具有普遍性。

如果你的机器上没有数据库的话会影响你的练习,不过幸运的是,你可以在网上找到云服务器试用包。
例如阿里云或者腾讯云都有免费额度。
我租了一台1 核1 G的ECS,安装了Navicat并练习,逐渐熟练了。

PS:切记在生产环境中操作ALTER TABLE时要特别小心,尤其是添加字段的时候。
最好先在测试库中运行它。
我的一位同事忘记添加 IF NOT EXISTS 并最终修改了 CUSTOMER 表...