insert时出现主键冲突的处理方法【转载】

摘要:
总结下,有三种解决方案来避免出错。

原文出处:http://hi.baidu.com/ytjwt/blog/item/1ccc2c26022b0608908f9d8c.html

使用"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

免责声明:文章转载自《insert时出现主键冲突的处理方法【转载】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ssh 使用 sed 替换的时候,替换的字符串有单双引号的时候怎么用2、设备树的规范(dts和dtb格式)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

分页 算法

算法如下: currentPage = (pageSize - 1) * pageSize                     //取得当前页 pageCount = (totalrecords + pageSize - 1) / pageSize  //取得所有页数 oracle 三层查询 完成分页 sql: select * from...

Oracle中Merge into用法总结

MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。 语法: MERGE INTO [your table-...

oracle中imp命令具体解释

oracle中imp命令具体解释 Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文件。imp使用的基本格式:imp[username[/password[@service]]],下面例举imp经常使用用法。 1. 获取帮助 imp help=y 2. 导入一个完整数据库 imp syste...

SQL Server 排序规则(摘)

3Sql Server数据库,在跨库多表连接查询时,若两数据库默认字符集不同,系统就会返回这样的错误:“无法解决equal to操作的排序规则冲突” 一、错误分析:这个错误是因为排序规则不一致造成的,比如:create table #t1(name varchar(20) collate Albanian_CI_AI_WS,  value int)cre...

mysql获取当月数据_MySQL中获取天、周、月等数据

MySQL中获取天、周、月等数据 1.今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 2.昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 3.近7天 SELECT * FROM 表名 where...

oracle教程:PLSQL常用方法汇总

oracle教程:PLSQL常用方法汇总 在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set nls_language='SIMPLIFIED CHINESE';主要知识点:一、有关表的操作1)建表 create table test as sel...