博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
insert时出现主键冲突的处理方法【转载】
阅读量:6889 次
发布时间:2019-06-27

本文共 2166 字,大约阅读时间需要 7 分钟。

原文出处:

使用"insert into"语句进行数据库操作时可能遇到主键冲突,用户需要根据应用场景进行忽略或者覆盖等操作。总结下,有三种解决方案来避免出错。

1. insert ignore into
遇主键冲突,保持原纪录,忽略新插入的记录。
mysql> select * from device ;
+-------+--------+-------------+
| devid | status | spec_char   |
+-------+--------+-------------+
|     1 | dead   | zhonghuaren | 
|     2 | dead   | zhong       | 
+-------+--------+-------------+
2 rows in set (0.00 sec)

mysql> insert into device values (1,'alive','yangting');

ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

mysql> insert ignore  into device values (1,'alive','yangting');

Query OK, 0 rows affected (0.00 sec)

mysql> select * from device ;

+-------+--------+-------------+
| devid | status | spec_char   |
+-------+--------+-------------+
|     1 | dead   | zhonghuaren | 
|     2 | dead   | zhong       | 
+-------+--------+-------------+
2 rows in set (0.00 sec)
可见 insert ignore  into当遇到主键冲突时,不更改原纪录,也不报错

2. replace into

遇主键冲突,替换原纪录,即先删除原纪录,后insert新纪录

mysql> replace  into device values (1,'alive','yangting');

Query OK, 2 rows affected (0.00 sec)

mysql> select * from device ;

+-------+--------+-----------+
| devid | status | spec_char |
+-------+--------+-----------+
|     1 | alive  | yangting  | 
|     2 | dead   | zhong     | 
+-------+--------+-----------+
2 rows in set (0.00 sec)

3. insert into ... ON DUPLICATE KEY UPDATE
其实这个是原本需要执行3条SQL语句(SELECT,INSERT,UPDATE),缩减为1条语句即可完成。
IF (SELECT * FROM where 存在) {
    UPDATE  SET  WHERE ;
} else {
    INSERT INTO;
}
如:mysql> insert into device values (1,'readonly','yang') ON DUPLICATE KEY UPDATE status ='drain';
Query OK, 2 rows affected (0.00 sec)

上面语句伪代码表示即为

if (select * from device where devid=1) { 
    update device set status ='drain' where devid=1 
} else {
    insert into device values (1,'readonly','yang')
}
很明显,devid=1  是有的,这样就执行update操作
mysql> select * from device ;
+-------+--------+-----------+
| devid | status | spec_char |
+-------+--------+-----------+
|     1 | drain  | yangting  | 
|     2 | dead   | zhong     | 
+-------+--------+-----------+
2 rows in set (0.00 sec)
 

测试表:

CREATE TABLE `device` (
`devid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`status` enum('alive','dead','down','readonly','drain') DEFAULT NULL,
`spec_char` varchar(11) DEFAULT '0',
PRIMARY KEY (`devid`)
) ENGINE=InnoDB

 

转载地址:http://tgqbl.baihongyu.com/

你可能感兴趣的文章
RAD Studio XE2/XE3 官方 ISO 下载地址 (2012-09-05更新)
查看>>
神奇的代码系列(持续更新)
查看>>
Redis的三种启动方式
查看>>
python基础----面向对象进阶,isinstance,issubclass,反射,内置attr,定制自己的数据类型...
查看>>
使用git error: RPC failed; result=22, HTTP code = 411
查看>>
C++ MessageBox()
查看>>
Mac下PyCharm快捷键大全
查看>>
【计算几何初步-凸包-Graham扫描法-极角序】【HDU1348】 WALL
查看>>
5.运算符
查看>>
@vue/cl构建得项目下,postcss.config.js配置,将px转化成rem
查看>>
搭建gitlab本地服务
查看>>
day02
查看>>
SpringBoot慕课学习-SpringBoot开发常用技术整合-资源文件属性配置
查看>>
命令导入证书
查看>>
Django-CBV
查看>>
NativeWindow_01
查看>>
【Flutter学习】基本组件之图片组件Image
查看>>
(转)工作之路---记录LZ如何在两年半的时间内升为PM
查看>>
CoreAnimation
查看>>
JS基础属性跟运算
查看>>