2011-03-11 35 views
2

好吧,讓我們說我們有兩行:mysql可能無法更新某些數據嗎?

member_id, name

令說member_id = 15,name = '約翰';

我想更新這些數據,並做以下查詢:

mysql_query("UPDATE members SET member_id = 14, name = 'Peter' WHERE member_id = 15

這只是一個例子,但有可能是,MySQL會失敗,UPDATE例如,僅排名。所以,在完成上面的mysql_query之後,它將變成member_id = 15和name ='Peter';

這只是一個例子。今天,我的網站出現了類似的情況,我檢查了我的代碼100次,發現沒有錯誤,並且在它之前沒有發現過相同的錯誤。

那麼,我應該重新檢查我的代碼一百多次,還是可能發生?

非常感謝。

+1

它會變成**'member_id = 14' **和'name ='Peter''。正確? – 2011-03-11 21:02:30

+0

member_id是否有一個密鑰(並且更新會嵌套重複的密鑰)? – konsolenfreddy 2011-03-11 21:02:52

+0

@ypercube:是的。 @freddy K.:這只是一個例子,我告訴過你。 – 2011-03-11 21:04:01

回答

2

根據規範,單個UPDATE陳述是原子的;即:要麼更新所有列,要麼不更新它們中的任何一個。

所以不,不應該發生。但是當然,MySQL可能存在一個錯誤。

+0

謝謝。如果確實如此,我完全不知道它是如何發生過的,而且只發生過一次。 – 2011-03-11 21:07:46

+0

我今天檢查了整個代碼幾百次,只知道,10分鐘後我創建了這個問題,我終於找到了錯誤的地方:D Omg,找出問題真是太酷了。 – 2011-03-11 21:15:41

0

or die(mysql_error());放在你的查詢後面,如果這真的發生了,那麼你至少知道它。

+0

它只發生過一次 - 今天,在此之前,從來沒有出現過相同的錯誤。 – 2011-03-11 21:04:38

+0

@hey:直到它再次發生,我真的不會擔心(但使用'die();'之後,如果它曾經選擇,將其捕獲) – 2011-03-11 21:06:44

0

我認爲它不應該發生,它會成爲member_id = 15和名稱='彼得'。就我所能看到的而言,SQL語法是正確的,它看起來都很好。如果你的數據庫發生了錯誤,並且你的查詢在那一刻執行,神只知道會發生什麼。儘管如此,大多數情況下,查詢完全執行或者不是,使mysql_query()返回false

你應該,至少已經建議檢查是否有其中一個代碼的任何錯誤,例如,如果你在一個在線商務網站如下:

mysql_query($sql) or die('An error occurred'); 

或類似的東西,如果你是在如下調試模式:

mysql_query($sql) or die(mysql_error()); 
0

我不像其他人那樣確信單行更新是原子的。 MySQL與標準SQL的不同之處在於它執行單表UPDATE從左到右的列分配。這意味着member_id = 14name = 'Peter'之前完成。如果name = 'Peter'違反約束條件,或者觸發另一個失敗的更新,則該分配將失敗。但是,整個聲明是否失敗可能取決於各種因素,包括表是否使用事務安全引擎。