程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL生產庫Insert了2次同樣的記錄但是主鍵ID是不一樣的問題的分析過程

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

編輯:關於MYSQL數據庫

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved