mysql 插入新数据,如果有旧数据就覆盖更新,怎么写。

mysql 插入新数据,如果有旧数据就覆盖更新,怎么写。,第1张

insert into table_name(a,b,c,d) values(a,b,c,d)

on duplicate key update d=d+1

需要设置唯一索引,当插入的数据与已有数据冲突时(仅插入会报错),触发update子句

执行 update 语句以前

先执行

START TRANSACTION

开始事务处理

会话1:

mysql>select * from test_main

+----+-------+

| id | value |

+----+-------+

| 1 | ONE |

| 2 | TWO |

| 3 | THREE |

| 4 | Four |

+----+-------+

4 rows in set (0.00 sec)

mysql>START TRANSACTION

Query OK, 0 rows affected (0.00 sec)

mysql>UPDATE test_main SET value = 'FOUR-4' WHERE id = 4

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

会话2:

mysql>select * from test_main

+----+-------+

| id | value |

+----+-------+

| 1 | ONE |

| 2 | TWO |

| 3 | THREE |

| 4 | Four |

+----+-------+

4 rows in set (0.00 sec)

mysql>START TRANSACTION

Query OK, 0 rows affected (0.00 sec)

mysql>UPDATE test_main SET value ='THREE-3' WHERE id = 3

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

会话1:

mysql>select * from test_main

+----+--------+

| id | value |

+----+--------+

| 1 | ONE|

| 2 | TWO|

| 3 | THREE |

| 4 | FOUR-4 |

+----+--------+

4 rows in set (0.00 sec)

mysql>UPDATE test_main SET value ='THREE-5' WHERE id = 3

由于 id=3 的行,已经被会话2修改,并锁定,因此会话1当前进入等待状态。

一定时间后超时错误发生

mysql>UPDATE test_main SET value ='THREE-5' WHERE id = 3

ERROR 1205 (HY000): Lock wait timeout exceededtry restarting transaction

会话2:

mysql>commit

Query OK, 0 rows affected (0.05 sec)

会话1:

mysql>commit

Query OK, 0 rows affected (0.03 sec)

mysql>select * from test_main

+----+---------+

| id | value |

+----+---------+

| 1 | ONE |

| 2 | TWO |

| 3 | THREE-3 |

| 4 | FOUR-4 |

+----+---------+

4 rows in set (0.00 sec)

python爬取数据后储存数据到mysql数据库后添加新数据覆盖旧。

1、先根据PRIMARY_KEY或UNIQUE字段查询库里是否存在数据(select)。

2、如果存在数据,则更改许要更改的字段(update)。

3、如果不粗在数据,则进行添加新数据(insert)。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5896465.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-07
下一篇 2023-03-07

发表评论

登录后才能评论

评论列表(0条)

保存