mysql 存储过程 若主键冲突则更新,不冲突则插入数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 存储过程 若主键冲突则更新,不冲突则插入数据相关的知识,希望对你有一定的参考价值。

我写了一个存储过程,需要往一个主键为 IDDATE的表里插入数据。
当主键冲突的时候,就更新数据,不冲突的时候则插入新数据。
但是麻烦的是这批数据是select出来的批量数据,请问如何在满足上述条件的情况下,批量插入和更新?
比如说以下这个语句,怎样可以实现 id是主键
insert into table1
select
a.id as id,
a.c_id as cid,
b.m_id as mid,
c.name as name
from
table_A a,
table_B b,
table_C c
where
b.id=a.c_id
and c.id=b.m_id
ON DUPLICETE KEY UPDATE
c_id=values(a.c_id),
m_id=values(b.m_id),
name=values(c.name)

你可以分两部份导入
先导入在表里有IDDATE的更新部份

mysql> UPDATE 表1 SET 列名=(SELECT 列名 FROM 表2
WHERE 表1.IDDATE=表2.IDDATE)
WHERE IDDATE in (SELECT IDDATE FROM 表2);

再导入插入部份
INSERT INTO 表1 (SELECT IDDATE,列名 FROM 表2
WHERE DDATE not in (SELECT IDDATE FROM 表2));追问

不可能这样做的,数据写在SP里,每次过来的数据流都是单条数据。

追答

按你补充的提问,想实现ID是主键,可以把TABLE_A的ID列进行分组
insert into table1
select
a.id as id,
a.c_id as cid,
b.m_id as mid,
c.name as name
from
(select id,max(c_id) from table_A group by id) a,
table_B b,
table_C c
where
b.id=a.c_id
and c.id=b.m_id
ON DUPLICETE KEY UPDATE
c_id=values(a.c_id),
m_id=values(b.m_id),
name=values(c.name)

当然这样得到的数据是确保了ID列是主健,但有些数据就没了

参考技术A merge语句处理,根据条件选择插入还是更新,但是我不知道mysql是否支持

MySQL 主键冲突,无法插入数据

数据库版本:5.6.16

问题:
开发来电话说仓库无法下单,程序插入数据提示:入库单 xxxx1589762285确认失败:Duplicate entry ‘8388607‘ for key ‘PRIMARY‘

查看数据库表结构:
show create table  table_name;
表结构的字段为主键自增,应该没问题啊,仔细一看发现表结构id类型如下:
`id` mediumint(8) NOT NULL AUTO_INCREMENT

字段类型为mediumint,支持的最大值为8388607,确定问题。

修改表结构的id字段类型,修改的时候一定要注意加上auto_increment,否则修改完,主键自增为失效

alter table table_name  modify id bigint not null aotu_increment;

修改成功后,联系开发,让仓库那边重新试一下,没问题!

以上是关于mysql 存储过程 若主键冲突则更新,不冲突则插入数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql实现upsert

MySQL replace into

关于在MySQL中实现upsert操作

Mysql高级操作

FlinkFlink 写入 MySQL主键冲突 默认Upsert策略

sql解决主键冲突