数据库主键冲突解决

来源:互联网 发布:武汉seo搜索排名优化 编辑:程序博客网 时间:2024/05/16 18:48

数据库主键冲突解决

参考:https://zhidao.baidu.com/question/681411103315116572.html?qbl=relate_question_3&word=%D6%F7%BC%FC%B3%E5%CD%BB%D4%F5%C3%B4%BD%E2%BE%F6

顺便介绍一种刚发现的解决360doc无法复制的问题:
右击——查看源代码——全部复制——新建一个html文档,粘贴进去用浏览器打开即可

新增数据的基本语法为:

insert into + 表名 + [(字段列表)] + values (值列表);

在数据插入的时候,假设主键对应的值已经存在,则插入失败!这就是主键冲突。
当主键存在冲突(duplicate key)的时候,可以选择性的进行处理,即忽略、更新或者替换。

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

项目采用UUID作为主键的冲突解决

在项目中,比如插入一条user信息,主键采用随机UUID的冲突解决。
可以考虑采用第一种忽略的方式,当主键冲突,数据库插入语句的返回值为0,然后我们判断数据库插入的返回值,如果为0,则重新生成主键,再次进行插入,直到完成插入操作!

作者:何必等明天
出处:http://www.cnblogs.com/xzwblog/
欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利.
分类: 数据库