问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql 插入数据如何防止重复

发布网友 发布时间:2022-04-19 11:39

我来回答

5个回答

热心网友 时间:2022-04-07 16:58

如果表中包含有一个自动递增字段AUTO_INCREMENT,并用 INSERT ... UPDATE 插入一行,函数 LAST_INSERT_ID()会返回AUTO_INCREMENT的值,如果这个语句更新某一行, LAST_INSERT_ID() 就没有意义了。但是,你可以通过用 LAST_INSERT_ID(expr)使它变得有意义,假如id字段是自动递增栏的话,使 LAST_INSERT_ID() 对更新语句有意义的方法如下:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
ON DUPLICATE KEY UPDATE命令语句,那么在唯一索引或者主索引的作用下将不插入与数据库教程记录重复的内容,但同时会更新数据库中的旧记录。例如,字段a被声明为唯一索引并且里面只包含有值为1的记录,以下两个语句会达到同样的效果:一、INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;二、UPDATE table SET c=c+1 WHERE a=1;可以在插入更新语句 INSERT ... UPDATE 中使用 VALUES(字段名) 函数去关联某一行记录。也就是说, VALUES(字段名) 可以用在UPDATE语句中去更新某字段的值而不会出现重复键。这个函数在多行插入中尤其有用。但是函数 VALUES() 仅当用在 INSERT ... UPDATE 语句中才有意义,否则会返回NULL。例如:INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
其它方法insert into songinfo(songname,songtime,songpath) select 'aaa','bb' ,'cc' from al where not exists(select * from songinfo where songname='123')//上述命令在MYSQL3.x版本上不能执行,5.0.24的可以
比如我的Mysql当中某database存在url这张表,现在要有C API 将url,url_hash,domain这三个变量的值插入到数据库中,url_hash是主键,本来为了不至插入重复项,应该判断一下的,现在只要这一条SQL语句就行了,什么都不要管,减少了大量的查询和判断工作,我只能说一句:太爽了。如下:SQL语句:
insert into TABLE(FIELD0,FIELD1...) select VALUE0,VALUE1 ,... from al where not exists(select * from TABLE where FIELDN=VALUEN)代码:
int store_url(char *url)
{
char *key, url_hash[HASHLEN], domain[DOMAINLEN], sqlstr[SQLSTRLEN];......sprintf (sqlstr, "insert into url(url,url_hash,domain) select '%s','%s','%s' from al where not exists(select * from url where url_hash='%s') ", url, url_hash, domain, url_hash);
if (mysql_query (conn, sqlstr)) //大部分情况下失败是由于数据库关闭,所以可以在以下添加上再连接MySQL的代码,不赘写!
{ printf ("Error:%sn", mysql_error (conn));
return;
}
}最后有一种比较简单的方法就是先查询当前的数据在数据库是否有相同的,如果有的话就提示如
*/
$title ='www.111cn.net';
$sql = "Select * from tablename where title='$title'";
$query = mysql_query( $sql );
if( mysql_num_rows( $query ) )
{
exit('不能重复插入相同的记录');
}
else
{
$sql ="insert tablename values('$title')";
mysql_query( $sql );
exit('保存记录成功');
}
//这种方的不好之处在于多次查询了数据库,并且代码也冗余了,好了到底你用那排除重复数据的方法你自己根据自己的情况而定吧。

热心网友 时间:2022-04-07 18:16

如果是这样的话,建议不要直接使用传输了,换成使用先备份到本地sql文件,然后把文件拷到另一个数据库服务器上,还原数据库就行了。这个更方便,也是常用之法。呵呵。

热心网友 时间:2022-04-07 19:51

那你写个存储过程呗,插入前查找数据是否已存在,存在则删除原来的。然后插入。

热心网友 时间:2022-04-07 21:42

呵呵,为什么要去判断呢,你自己把以前导入的删掉就行了呀,再重新导入就可以了, 我一般都是这样做的

热心网友 时间:2022-04-07 23:50

加锁情况与死锁原因分析

为方便大家复现,完整表结构和数据如下:

CREATE TABLE `t3` (
`c1` int(11) NOT NULL AUTO_INCREMENT,
`c2` int(11) DEFAULT NULL,
PRIMARY KEY (`c1`),
UNIQUE KEY `c2` (`c2`)
) ENGINE=InnoDB

insert into t3 values(1,1),(15,15),(20,20);


在 session1 执行 commit 的瞬间,我们会看到 session2、session3 的其中一个报死锁。这个死锁是这样产生的:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
上海优良Inconel625螺丝规格齐全 C3-80螺丝介绍 C3-80螺丝通常用1Cr17Ni2材料生产 【淄博、滨州装饰装修】如何让背阴客厅变亮 滨州城市人家怎么样 滨州装修 ipad可以指纹解锁吗 处理卫生间外墙渗水的几个办法 装修知识卫生间外墙漏水怎么处理 北京中医药大学法学好吗 如何解决mysql读写效率 mysql 批量更新10000+的数据,有什么效率比较高的方法 mysql中有重复的数据,怎么删除,只留下一条就行了。 关于mysql处理百万级以上的数据时如何提高 mysql left join 右表存在重复数据,怎么处理 如何提高mysql大批量数据更新的效率 如何让mysql速度更快的响应?如何提高读取和查询速度 404 Not Found mysql连表查询出现重复的数据怎么办 mysql如何去除两个字段数据相同的记录 mysql 现在表中出现重复数据,怎样删除重复数据 请教mysql大数据删除重复 在Mysql下如何删除重复的数据~ 怎么删除重复的Mysql数据? mysql UNION 有重复的数据,怎么解决 mysql 多个字段有重复数据, 我需要进行去重处理 mysql重复数据处理? 怎么样美团点外卖可以最划算?最划算?最划算? 美团外卖红包外卖怪? 男生问我上班累不累是什么意思? mysql数据库如何用一条语句同时查多个数据库 怎样点外卖最省钱? 外卖红包外卖怪? 外卖优惠券外卖怪公众号哪个好用? QQ5位,6位,7位,8位,9位,分别发行于哪一年? 怎样设置QQ密码几位数? 美团优先怎么邀请老顾客下单 2020年的QQ号是几位数吖?? 如何定位QQ? qq号9位数,是哪一年出的 QQ有十位号码吗 ? 2004年QQ是几位数的? qq里多小位才算小号怎样分别 怎样申请 9位数字的 qq号 404 Not Found 腾讯QQ支持64位操作系统吗? QQ号都有几位数的? qq10位号*****88848值 多少钱 腾讯QQ十位等级最高是多少? 我的QQ是10位能有办法变9位嘛