MySQL与PostgreSQL中解决插入主键冲突的方法
PostgreSQL的案例
注意:on conflict do 语法,是在postgresql9.5版本推出的!,之前的版本不兼容!PostgreSQL upsert功能(insert on conflict do)的用法
安装及配置pgcli工具
# brew安装 brew install pgcli # 配置文件位置 ~/.config/pgcli/config # 配置别名的地方 vim ~/.config/pgcli/config [alias_dsn] # example_dsn = postgresql://[user[:password]@][netloc][:port][/dbname] # 本地的连接 local_docker_5433 = postgresql://postgres:password@127.0.0.1:5433/appserver_runfast_clone
操作过程
# 进入数据库 创建数据库 使用数据库 pgcli -D local_docker_5433 create database whw_test_db; use whw_test_db; # 创建表 create table users (user_id varchar(255) not null constraint users_pkey primary key, user_name varchar(22) not null ) # 确认下表结构 \d+ users; # 插入几条数据 insert into users(user_id, user_name) values('123','whw111'),('222','www222'); # 确认数据 select * from users;
再往里面插入数据的话会报主键冲突:
on conflict do nothing
insert into users(user_id, user_name) values('123','naruto'),('222','sasuke') on conflict(user_id) do nothing;
on conflict do update set
insert into users(user_id, user_name) values('123','naruto'),('222','sasuke') on conflict(user_id) do update set user_name=excluded.user_name;
MySQL的案例
安装配置mycli
// brew 安装 brew install mycli // 用户名:root;密码:123;本地端口是:3307 mycli -uroot -p123 -h127.0.0.1 -P 3307
初始化过程
# 创建数据库 create database whw_mysql_db; use whw_mysql_db; # 建表 create table users( user_id varchar(255) not null, user_name varchar(22) not null, primary key (user_id) ); # 插入几行数据 insert into users(user_id,user_name) values("111","whw1"),("222","whw2");
~~~
再往里面插入相同user_id的数据会报错:
insert ignore
insert ignore into users(user_id,user_name) values("111","naruto"),("222","sasuke");
ON DUPLICATE KEY UPDATE
insert ignore into users(user_id,user_name) values("111","naruto"),("222","sasuke") on duplicate key update user_name=values(user_name);
~~~
自己的其他文档
并发处理IO任务与MySQL中ON DUPLICATE KEY UPDATE的使用