我在MySQL中看到一個很奇怪的行爲,看起來像一些奇怪的錯誤。我知道通常會將經過驗證的工具歸咎於自己的錯誤,但我一直在討論這個問題。奇怪的MySQL行爲,看起來像一個SQL錯誤
我有2個表,我,與2797條記錄,和C,與1429 C參考一
我想要刪除未使用的C在我所有的記錄,所以我做:
select * from i where id not in (select id_i from c);
返回0條記錄,在給定每個表中的記錄計數的情況下,它在物理上是不可能的。我也非常確定查詢是正確的,因爲它與前兩個小時使用的相同類型的查詢來清理其他帶有孤立記錄的表。
爲了使事情更離奇......
select * from i where id in (select id_i from c);
不工作,並給我帶來了1297條記錄,我不想刪除。
因此,IN工作,但不是不。
更糟糕的是:
select * from i where id not in (
select i.id from i inner join c ON i.id = c.id_i
);
,做的工作,但它應該是等同於第一個查詢(我只是在這一點上想瘋了的東西)。
唉,我不能使用這個查詢來刪除,因爲我正在使用我從子查詢中刪除的同一個表。
我假設東西在我的數據庫已損壞在這一點上。
萬一它很重要,這些都是沒有任何外鍵的MyISAM表格,而且我在我的開發機器和生產服務器上運行了相同的查詢,結果相同,因此無論那裏有什麼腐敗存在一個mysqldump /源代碼循環,聽起來很奇怪。
關於可能出錯的任何想法,或者更重要的是,我該如何修復/解決此問題?
謝謝!
Daniel
哇,我感到令人難以置信的愚蠢,非常感謝你,非常,非常驚訝,我從來沒有發現這種行爲在超過10年的使用SQL。 非常感謝您的先生! – 2010-06-01 21:32:06
@Daniel - 'NOT IN(...,NULL)'總是不會返回任何內容。要了解爲什麼會出現這種情況,請參閱此鏈接http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued-logic/ – 2010-06-01 21:43:43