MySQL生產庫Insert了2次同樣的記錄但是主鍵ID是不一樣的問題的分析過程_Mysql

來源:互聯網
上載者:User

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能不動盡量不要動。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.