避免mysql反復拔出記載的辦法。本站提示廣大學習愛好者:(避免mysql反復拔出記載的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是避免mysql反復拔出記載的辦法正文
避免mysql反復拔出記載的辦法有許多種,經常使用的是ignore,WordStr,ON DUPLICATE KEY UPDATE,固然我們也能夠在php中加以斷定了。
計劃一:應用ignore症結字
假如是用主鍵primary或許獨一索引unique辨別了記載的獨一性,防止反復拔出記載可使用:
代碼以下:
INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('[email protected]', '99999', '9999');
如許當有反復記載就會疏忽,履行後前往數字0
還有個運用就是復制表,防止反復記載: 代碼以下:
INSERT IGNORE INTO `table_1` (`name`) SELECT `name` FROM `table_2`;
計劃二:應用WordStr
語法格局:
代碼以下:
REPLACE INTO `table_name`(`col_name`, ...) VALUES (...); REPLACE INTO `table_name` (`col_name`, ...) SELECT ...; REPLACE INTO `table_name` SET `col_name`='value',
...算法解釋:
REPLACE的運轉與INSERT很相像,然則假如舊記載與新記載有雷同的值,則在新記載被拔出之前,舊記載被刪除,即:
測驗考試把新行拔出到表中
當由於關於主鍵或獨一症結字湧現反復症結字毛病而形成拔出掉敗時: 從表中刪除含有反復症結字值的抵觸行 再次測驗考試把新行拔出到表中 舊記載與新記載有雷同的值的斷定尺度就是: 表有一個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()) else update t set update_time = getdate() where phone= '1'
計劃三:ON DUPLICATE KEY UPDATE
如上所寫,你也能夠在INSERT INTO…..前面加上 ON DUPLICATE KEY UPDATE辦法來完成。假如您指定了ON DUPLICATE KEY UPDATE,而且拔出行後會招致在一個UNIQUE索引或PRIMARY KEY中湧現反復值,則履行舊行UPDATE。 例如,假如列a被界說為UNIQUE,而且包括值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;
假如行作為新記載被拔出,則受影響行的值為1;假如原本的記載被更新,則受影響行的值為2。
正文:假如列b也是獨一列,則INSERT與此UPDATE語句相當: 代碼以下:
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。
代碼以下:
INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`);
本語句與以下兩個語句感化雷同:
代碼以下:
INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE `c`=3; 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 只存眷主鍵對應記載是不存在,無則添加,有則疏忽。
php避免反復拔出記載實例
<?php $link=mysql_connect(‘localhost','root','1234'); //獲得MySQL數據庫銜接 $username=$_GET["name"]; //獲得從客戶端表單傳過去的數據 $q="select * from usertable where user_name='$username'"; mysql_query("SET NAMES gb2312"); //防止湧現中文亂碼 $rs = mysql_query($q, $link); //查詢數據庫 $num_rows = mysql_num_rows($rs); //獲得查詢成果的總行數 if($num_rows==0) // 猛火? liehuo.net 迎接復制,謝絕歹意收集 liehuo.net { $exec="insert into student (user_name) values ($username)"; mysql_query("SET NAMES gb2312"); mysql_query($exec, $link); //若沒有此用戶則將數據拔出到數據庫(注冊用戶) echo "用戶注冊勝利!"; } else { echo "該用戶名已存在,請從新選擇用戶名!"; } ?>
附一些刪除反復記載的辦法
查詢及刪除反復記載的SQL語句
1、查找表中過剩的反復記載,反復記載是依據單個字段(peopleId)來斷定
select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
2、刪除表中過剩的反復記載,反復記載是依據單個字段(peopleId)來斷定,只留有rowid最小的記載
delete from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)
3、查找表中過剩的反復記載(多個字段)
select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
4、刪除表中過剩的反復記載(多個字段),只留有rowid最小的記載
delete from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
5、查找表中過剩的反復記載(多個字段),不包括rowid最小的記載
select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
==============================
SOLVED! Created 3 separated queries for each row, working for now!
So with added UNIQUE INDEX to the (auctionid, order) pair have this workable code:
INSERT IGNORE INTO selections ( selections.auctionid, selections.order, selections.title, startamount ) SELECT auctions.id, 1, PlayerA, 0.01 FROM auctions, game WHERE auctions.BetfairMark = game.BetfairMarketID ; INSERT IGNORE INTO elections ( selections.auctionid, selections.order, selections.title, startamount ) SELECT auctions.id, 2, PlayerB, 0.01 FROM auctions, game WHERE auctions.BetfairMark = game.BetfairMarketID
以上就是本文的全體內容,願望對年夜家的進修有所贊助。