Email裡面收到朋友laopan的求助
laopan:
insert into HudsonResult(JobID,EnvironmentID,FirstSessionID,RerunSessionID,State,Desp,OtherInfo) values
((select ID from Hudson where Stream='A7510_R52_Integration' and State='N' and pakName='needCompile' and User='jinhaiz'),0,'N','N','N','smoke_test','')
如果相同的記錄不存在就執行上面這條insert命令,防止執行是insert兩次。
這個語句該怎麼寫?
能明白不?
現在有個問題就是insert了2次同樣的記錄但是主鍵ID是不一樣的。
me :
如果是mysql數據庫的話:
1 如果你表中有唯一健的話,可以通過這個唯一健來進行賽選的。
2 如果沒有唯一健的話,你需要有判斷數據是否重復的條件,根據這個條件先select出來,看是否存在,如果不存在就insert,如果存在要麼覆蓋要麼就忽略掉不執行,這個過程需要多條sql語句,最好開啟事務來進行控制。
Mysql中有一個replace以及Insert into ..... on duplicate key update 來判斷對重復數據進行insert或者update的,但是這是依據主健或者唯一健來判斷的。你可以參考下下面這篇文章(http://www.jb51.net/article/47090.htm)。
laopan:
1.唯一鍵怎麼篩選?現在的問題是唯一的不同是key不一樣,別的列都是一樣的。
me :
把表結構發給我,我看看 , 通過執行 命令 show create table HudsonResult; 可以得出表結構。
如果沒有唯一健的話,就不能從sql層面去判斷數據的唯一性,否則資源消耗太大了。需要從應用角度數據來源角度去驗證過濾。
laopan:
mysql> show create table HudsonResult;
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| HudsonResult | CREATE TABLE `HudsonResult` (
`JobID` int(32) NOT NULL,
`EnvironmentID` int(32) NOT NULL,
`FirstSessionID` varchar(100) default NULL,
`RerunSessionID` varchar(100) default NULL,
`State` varchar(5) default NULL,
`ID` int(32) NOT NULL auto_increment,
`Desp` varchar(100) default NULL,
`ExecNum` int(32) default NULL,
`FailNum` int(32) default NULL,
`ATCStartTime` datetime default NULL,
`ATCEndTime` datetime default NULL,
`FocNumBefore` int(32) default '0',
`FocNumAfter` int(32) default '0',
`Priority` int(32) default '0',
`FocDesp` varchar(5000) default '',
`OtherInfo` varchar(100) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM AUTO_INCREMENT=14910 DEFAULT CHARSET=latin1 |
+--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
現在的問題背景是這樣的,網頁上insert後,電腦卡了一下,這個時候還沒有返回,又點了一下,變成又insert了一次,導致2條記錄
內容是一樣的,但是主鍵是不一樣的,java你也做過,有沒有啥想法,避免這個?
ME :
把提交按鈕做下處理,很簡單的,提交一次後,按紐設置為灰色的,操作者點擊不了,只有等待提交處理結果出來繼續進行下一步操作。
laopan:
搞定了,呵呵,簡單易用哈,考慮多了,謝啦。
總結:可見有很多時候錯誤數據都是由於應用的bug導致的,清理數據的同時要從根源處理問題,數據層面的sql能不動盡量不要動。