mysql教程 sql 防止重復插入相同的記錄實例
首頁我們來看看防止頁面重復刷新插入防止方法
方法:
表單頁setcookie("pass","ok");
處理頁
if($_COOKIE["pass"]=="ok"){
mysql_query("insert inot .....");
}
else{
echo "頁面已經過期,請不要重復刷新";
exit;
}
setcookie("pass","");
再者來看看在mysql操作時的防止重復插入數據的有效方法
如果表中包含有一個自動遞增字段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 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('保存記錄成功');
}
//這種方的不好之處在於多次查詢了數據庫,並且代碼也冗余了,好了到底你用那排除重復數據的方法你自己根據自己的情況而定吧。