数据库主键冲突解决
来源:互联网 发布:武汉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/
欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利.
分类: 数据库
阅读全文
0 0
- 数据库主键冲突解决
- 主键冲突
- Mysql互为主从,解决主键ID冲突的方案
- oracle 导入数据库备份文件步骤,插入数据提示主键冲突
- MySQL数据库UUID()函数引起主键冲突问题
- 高并发 数据库自增主键 解决
- 名字空间解决数据库冲突问题
- 运用名字空间解决数据库冲突问题
- Hibernate3主键冲突问题
- Merge 主键冲突问题
- Mysql主键冲突异常
- MySQL主键冲突问题
- mysql 主键冲突更新
- insert主键冲突控制
- 更新数据库Sequence,解决数据库恢复主键重复的错误
- 在MySql中建立存储过程和解决insert into select 中主键冲突的问题
- 主主复制-主主复制时的主键冲突解决
- 解决冲突(避免冲突)
- Python3.5 tkinterGUI
- Python杂
- Windows7+GPU+CUDA环境开发
- lunch添加新选项
- mysql 常用
- 数据库主键冲突解决
- Git常用命令
- Linux内建命令列表
- mybatis里面的resultMap中为什么只配置了jdbctype而不配置javatype呢?他如何对应 javatype的啊?
- MVC 项目中为什么会有两个web.config
- 利用sql语句读取csv文件内容到db
- indexOf用法
- Uboot 2017.01 启动流程分析
- 清橙A1002. 01序列2