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 dual 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 dual 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 dual 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('保存记录成功')
}
//这种方的不好之处在于多次查询了数据库,并且代码也冗余了,好了到底你用那排除重复数据的方法你自己根据自己的情况而定吧。
我给你提供个思路,不要光从sql角度考虑,从java语言提供的异常机智考虑会更简单.因为我在对数据库进行轮询的时候也经常遇到这样的问题.最好的解决之道就是如果不存在就插入,如果重复,就跳过.
//将插入语句放在循环体中
for(int i=0i<ni++){
try{
//............省略具体插入代码
//插入的代码块,如果插入异常,将会发生异常 ,并被catch捕捉,但程序不做任何处理.继续循环下面一条!!所有不存在的数据将会被正常插入.所有插入异常将会被忽略!
}catch(Exception e){
}
}
---这个解决之道就是正常则插入,异常则跳过,满足了你的要求的.呵呵,就是你想要的答案吧.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)