方案一:使用ignore关键字
如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:
insert ignore into table_name(email,phone,user_id) values('test9@163.com','99999','9999'),这样当有重复记
录就会忽略,执行后返回数字0,还有个应用就是复制表,避免重复记录:
insert ignore into table(name) select name from table2
方案二:使用Replace
replace的语法格式为:
1. replace into table_name(col_name, ...) values(...)
2. replace into table_name(col_name, ...) select ...
3. replace into table_name set col_name=value, ...
算法说明:
REPLACE的运行与INSERT很相像,但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即:
1. 尝试把新行插入到表中
2. 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时:
从表中删除含有重复关键字值的冲突行
再次尝试把新行插入到表中
旧记录与新记录有相同的值的判断标准就是:表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义
。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。
REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。
受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或
更大(替换)。
eg:(phone字段为唯一索引)
replace into table_name(email,phone,user_id) values('test569','99999','123')
另外:在 SQL Server 中可以这样处理:
if not exists (select phone from t where phone= '1')
insert into t(phone, update_time) values('1', getdate())
update t set update_time = getdate() where phone= '1'
更多信息请看:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#replace
方案三:ON DUPLICATE KEY UPDATE
如上所写,你也可以在INSERT INTO.....后面加上 ON DUPLICATE KEY UPDATE方法来实现。
如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引
或PRIMARY KEY中出现重复值,
则执行旧行UPDATE。例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相
同的效果:
mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)
->ON DUPLICATE KEY UPDATE c=c+1;
mysql>UPDATE table SET c=c+1 WHERE a=1;
如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。
注释:如果列b也是唯一列,则INSERT与此UPDATE语句相当:
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 OR b=2与多个行向匹配,则只有一个行被更新。通常,您应该尽量避免对带有多个唯一关键字的表使用ON DUPLICATE KEY子句。
您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT...UPDATE语句的INSERT部分引用列值。
换句话说,如果没有发生重复关键字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的
col_name的值。本函数特别适用于多行插入。VALUES()函数只在INSERT...UPDATE语句中有意义,其它时候
会返回NULL。
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
本语句与以下两个语句作用相同:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
-> ON DUPLICATE KEY UPDATE c=9;
当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。
示例: 这个例子是我在实际项目中用到的:是将一个表的数据导入到另外一个表中,数据的重复性就得考虑(如下)。
唯一索引为:email
INSERT INTO table_name1(title,first_name,last_name,email,phone,user_id,role_id,status,campaign_id)
SELECT '','','',table_name2.email,table_name2.phone,NULL,NULL,'pending',29
FROM table_name2
WHERE table_name2.status = 1
ON DUPLICATE KEY UPDATE table_name1.status = 'pending'
语句的关键地方,都已高亮出来~
再贴一个例子:
insert into class select * from class1
ON DUPLICATE KEY UPDATE class.course = class1.course
其它关键:DELAYED 做为快速插入,并不是很关心失效性,提高插入性能。
IGNORE 只关注主键对应记录是不存在,无则添加,有则忽略。
特别说明:在MYSQL中UNIQUE 索引将会对null字段失效,也就是说(a字段上建立唯一索引):
insert into test(a) values(null)
insert into test(a) values(null)
是可以重复插入的(联合唯一索引也一样)。
方案一:使用ignore关键字如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:insert ignore into table_name(email,phone,user_id) values('test9@163.com','99999','9999'),这样当有重复记录就会忽略,执行后返回数字0,还有个应用就是复制表,避免重复记录:insert ...
这是一个基于
Python
的图书信息管理系统,使用
MySQL
数据
库管理
数据
,用tkinter做GUI界面。功能齐全,分管理员和读者两个部分,可注册、修改密码、切换登录。对读者系统,内含个人信息展示,可修改个人信息,查询、借阅、归还、预定图书,可随机浏览所有图书信息,可查看自己的借阅信息,可续借图书,有书籍逾期和书籍丢失的处理提示;对管理系统,除有读者系统的功能外,还可以
录入
、删除、修改图书,可以查看读者的预定图书。压缩包里贴心的带有Navivat安装包及其破解所需注册机,还有README.txt操作指南,简单明了易于学习修改,不同于可找到的开源项目(看的一脸懵逼,缺斤短两),欢迎私聊我或直接下载!
在
数据
存储过程中,可能会遇到
数据
主键
重复
的情况,我们可以通过下面几个方法进行处理:
1. 若
数据
不存在
插入
,
存在
更新
2. 使用duplicate key关键字,如
插入
数据
时
发生主键冲突就更新
数据
3. 使用Ingore关键字
4. 使用repl
最近在做项目
时
需要连接
数据
库进行测试,于是需要先把Excel
数据
导入到
数据
库里面去,
Python
操作sql server
数据
库的代码大致如下(操作
mysql
代码和这个差不多,只是包和连接信息的不同,可以自行百度):
import pymssql
import pandas as pd
server = "192.168.20.236:1433"#
数据
库地址以及端口
user = "sa"...
Python
使用唯一索引( on duplicate key update)避免
插入
重复
数据
这是我在
python
中向
数据
库中更新的
数据
。 每分钟大概500条
数据
,其中(candles,time_stamp,futures_type)会有大量
重复
数据
。
sql_insert = "INSERT INTO okex (date,candles,time_stamp,futures_type,ope...
mysql
支持直接写sql语句做判断,通过查询表
数据
是否
存在
,
不存在
则执行
插入
操作
INSERT INTO tb_news_topic(title,summary) SELECT '218',
'XQ33019920170811142528217' FROM DUAL WHERE NOT EXISTS(SELECT *
FROM tb_news_topic WHERE title = '111')
INSERT INTO table(field1, field2, fieldn) S