MySQL生產(chǎn)庫(kù)Insert了2次同樣的記錄但是主鍵ID是不一樣的問(wèn)題的分析過(guò)程
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','')
如果相同的記錄不存在就執(zhí)行上面這條insert命令,防止執(zhí)行是insert兩次。
這個(gè)語(yǔ)句該怎么寫?
能明白不?
現(xiàn)在有個(gè)問(wèn)題就是insert了2次同樣的記錄但是主鍵ID是不一樣的。
me :
如果是mysql數(shù)據(jù)庫(kù)的話:
1 如果你表中有唯一健的話,可以通過(guò)這個(gè)唯一健來(lái)進(jìn)行賽選的。
2 如果沒(méi)有唯一健的話,你需要有判斷數(shù)據(jù)是否重復(fù)的條件,根據(jù)這個(gè)條件先select出來(lái),看是否存在,如果不存在就insert,如果存在要么覆蓋要么就忽略掉不執(zhí)行,這個(gè)過(guò)程需要多條sql語(yǔ)句,最好開(kāi)啟事務(wù)來(lái)進(jìn)行控制。
Mysql中有一個(gè)replace以及Insert into ..... on duplicate key update 來(lái)判斷對(duì)重復(fù)數(shù)據(jù)進(jìn)行insert或者update的,但是這是依據(jù)主健或者唯一健來(lái)判斷的。你可以參考下下面這篇文章(http://www.dbjr.com.cn/article/47090.htm)。
laopan:
1.唯一鍵怎么篩選?現(xiàn)在的問(wèn)題是唯一的不同是key不一樣,別的列都是一樣的。
me :
把表結(jié)構(gòu)發(fā)給我,我看看 , 通過(guò)執(zhí)行 命令 show create table HudsonResult; 可以得出表結(jié)構(gòu)。
如果沒(méi)有唯一健的話,就不能從sql層面去判斷數(shù)據(jù)的唯一性,否則資源消耗太大了。需要從應(yīng)用角度數(shù)據(jù)來(lái)源角度去驗(yàn)證過(guò)濾。
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)
現(xiàn)在的問(wèn)題背景是這樣的,網(wǎng)頁(yè)上insert后,電腦卡了一下,這個(gè)時(shí)候還沒(méi)有返回,又點(diǎn)了一下,變成又insert了一次,導(dǎo)致2條記錄
內(nèi)容是一樣的,但是主鍵是不一樣的,java你也做過(guò),有沒(méi)有啥想法,避免這個(gè)?
ME :
把提交按鈕做下處理,很簡(jiǎn)單的,提交一次后,按紐設(shè)置為灰色的,操作者點(diǎn)擊不了,只有等待提交處理結(jié)果出來(lái)繼續(xù)進(jìn)行下一步操作。
laopan:
搞定了,呵呵,簡(jiǎn)單易用哈,考慮多了,謝啦。
總結(jié):可見(jiàn)有很多時(shí)候錯(cuò)誤數(shù)據(jù)都是由于應(yīng)用的bug導(dǎo)致的,清理數(shù)據(jù)的同時(shí)要從根源處理問(wèn)題,數(shù)據(jù)層面的sql能不動(dòng)盡量不要?jiǎng)印?/P>
- PHP+MySQL之Insert Into數(shù)據(jù)插入用法分析
- 正確使用MySQL INSERT INTO語(yǔ)句
- MySql insert插入操作的3個(gè)小技巧分享
- 逐步分析MySQL從庫(kù)com_insert無(wú)變化的原因
- 解析mysqldump的delay-insert選項(xiàng)
- Mysql中Insert into xxx on duplicate key update問(wèn)題
- mysql insert if not exists防止插入重復(fù)記錄的方法
- MySQL數(shù)據(jù)庫(kù)INSERT、UPDATE、DELETE以及REPLACE語(yǔ)句的用法詳解
- mysql 操作總結(jié) INSERT和REPLACE
- MySQL中insert語(yǔ)句的使用與優(yōu)化教程
相關(guān)文章
mysql如何比對(duì)兩個(gè)數(shù)據(jù)庫(kù)表結(jié)構(gòu)的方法
這篇文章主要介紹了mysql如何比對(duì)兩個(gè)數(shù)據(jù)庫(kù)表結(jié)構(gòu)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Windows下MySQL8.0.11社區(qū)綠色版安裝步驟圖解
在本教程中使用MySQL最新的MySQL服務(wù)8.0.11的社區(qū)綠色版本進(jìn)行安裝,綠色版為zip格式的包,安裝步驟分為四大步驟,具體哪四大步驟大家跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000)的原因及解決方法
網(wǎng)上查到的grant方式大多會(huì)報(bào)錯(cuò),主要原因是MySQL版本8.0后不能再使用原來(lái)的方式,這篇文章主要介紹了MySQL在grant時(shí)報(bào)錯(cuò)ERROR?1064?(42000),需要的朋友可以參考下2022-08-08一個(gè)單引號(hào)引發(fā)的MYSQL性能問(wèn)題分析
剛剛我們說(shuō)過(guò)了,生活中難免會(huì)有一些不如意,比如,我們用一個(gè)字符串類型的字段來(lái)作為主鍵,表面上,這太不如意了,然而,事實(shí)也證明這是有用的。2011-03-03