在项目高并发时,很容易出现数据库插入相同数据的情况,虽然可以使用唯一索引避免插入相同数据,但是不断的程序报错也是我们也避免的。
语法
使用 insert ... on duplicate key update ..
语法可以避免这种情况,举个例子
1 | drop table if exists `test`; |
主键 id
是天然的唯一索引,我们插入重复数据时会报错
1 | > INSERT INTO test (id, name) VALUES (1, 'wxnacy'); |
查看数据
1 | > SELECT * FROM `test`; |
下面我们来换个语句
1 | > insert into test (id, name) values (1, 'wxnacy') on duplicate key update update_ts = current_timestamp(); |
on duplicate key update
前面是正常的插入语句,其后跟着的是当唯一索引冲突时,想要更新的数据。
再换个使用场景,如果我想让数据库中用户名是唯一的,则可以先建立唯一索引,在使用该语法。
1 | > alter table test add unique index_name (name); |
这样及保证了避免插入重复数据,同时程序也没有报错,我还可以根据 update
的数据来分析问题的根源。
SQLAlchemy 中的使用
这个功能需要 SQLAlchemy 1.2 版本以上才支持,官方的例子
1 | from sqlalchemy.dialects.mysql import insert |
析出的 sql 语句为
1 | INSERT INTO my_table (id, data) |
参考资料
最近热读
扫码关注公众号,或搜索公众号“温欣爸比”
及时获取我的最新文章