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语句,必须在表中定义一个唯一索引或主键约束,以确保能够检测到重复的记录。