mysql 唯一键索引与主键(自增id为主键,to_sql了11条数据,为什么只入库了一条)

文章讲述了在使用to_sql进行数据入库时遇到的问题,由于表中存在主键和唯一索引,当唯一索引字段的数据已存在时,新数据会覆盖旧数据。作者发现这与字段重命名有关,特别是涉及唯一索引时,重命名可能导致数据库认为字段仍然存在,从而引发错误。解决方案是注意在重命名字段时检查和更新相关唯一索引。文章还提到了MySQL的INSERTINTO...ONDUPLICATEKEYUPDATE语句的作用和使用场景。
摘要由CSDN通过智能技术生成

1.今天写代码遇到一件很奇怪的事情,to_sql入库11条数据,最后发现只入库了一条。
看了看数据表结构,自增id为主键,也就是说,应该不会出现后面数据覆盖前面数据的情况呀。
在这里插入图片描述
2.然后看看了数据表索引,突然发现原来数据库里除了主键(PRIMARY KEY)以外,还有个唯一索引(UNIQUE KEY),如果没有设置唯一索引,那么主键就为唯一索引。因为我们有了唯一索引,那么当入库字段唯一索引已经在数据表里存在时,就会出现新数据覆盖老数据的情况。

新表结构展示
3.但是看见唯一索引里有个 type(100),晕。。。。type(100)是个啥?
我手动insert几条测试了一下,发现type(100)这边其实指定的唯一索引还是type字段。

4.这张表其实是我从其他地方导入的(下图为老表表结构),但是我因为实际需要,对老表做了一些改变:

  • type字段(长度100)重命名为bond_type
  • date重命名为statistic_date
  • statistic_date重命名为report_time
  • 新增type字段,type长度255

老表结构展示
5.老表索引为(下图):fund_id, date, announcement_id, type
新表索引为(第二张图):fund_id, statistic_date, announcement_id, type(100)
老表结构展示
6.使用得出一个结论:
当将索引其中一个字段重命名时,索引里的该字段也会更新为新字段;
如果该字段重命名时,另一个字段重命名为该字段,那么mysql认为该字段还存在并没有被重命名,那么就会出现上述这种问题。

7.所以重命名字段时,牵连到唯一索引时,一定要重点观察该唯一索引的情况。

8.二方库 to_sql的update模式的sql语句

INSERT INTO mytable (id, name, age) VALUES (1, 'Tom', 20)
ON DUPLICATE KEY UPDATE name='Tom', age=20;INSERT INTO mytable (id, name, age) VALUES (1, 'Tom', 20),(2, 'John', 25),(3, 'Alice', 30)
ON DUPLICATE KEY UPDATE name=VALUES(name), age=VALUES(age);

mysql 如果不存在就入库,存在就更新:

可以使用MySQL的INSERT INTO … ON DUPLICATE KEY UPDATE语句来实现如果记录不存在就插入,存在就更新的操作。

假设有一个名为mytable的表,包含以下字段:id, name, age。其中,id是主键。现在需要向该表中插入一条记录,如果id已经存在,则更新对应的记录。

上述语句中,首先尝试插入一条新记录,如果id为1的记录已经存在,则执行ON DUPLICATE KEY UPDATE后面的语句,将对应记录的name和age字段更新为指定的值。

需要注意的是,为了使用ON DUPLICATE KEY UPDATE语句,必须在表中定义一个唯一索引或主键约束,以确保能够检测到重复的记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

confined.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值