2010-06-09 89 views
14

我正在編寫一個應用程序,而且我正在使用MySQL作爲DBMS,我們正在下載物業優惠,並且出現了一些性能問題。舊的建築看起來像這樣: 屬性已更新。如果受影響的行數不是1,那麼更新不會被視爲成功,否則更新查詢將解決我們的問題。 如果更新不成功,並且受影響的行數大於1,則我們有重複項,我們將其全部刪除。如果更新不成功,如果需要刪除重複項,則會發生插入操作。此架構運行良好,但存在一些速度問題,因爲如果15天內未更新,屬性將被刪除。 理論上主要的問題是刪除屬性,因爲一些屬性在幾個月內仍然存在,並且索引距離很遠(我們正在談論500,000多個屬性)。是否替換成有where子句?

我們的主人告訴我使用replace into而不是刪除屬性,所有不贊成使用的屬性應該被視爲DEAD。我已經這樣做了,但是由於語法錯誤而開始出現問題,我找不到任何用where子句替換的例子(我想用新屬性替換DEAD屬性而不是刪除舊的財產和插入一個新的確保優化)。我的查詢是這樣的:

replace into table_name(column1, ..., columnn) values(value1, ..., valuen) where ID = idValue 

當然,我計算idValue和處理一切,但我有一個語法錯誤。我想知道,如果我錯了,並有一個替代成where子句。

我發現了一種替代解決方案,它比替換成(僅使用更新查詢)更好,因爲如果使用替換,刪除會發生在窗簾後面,但是我想知道是否我錯了當我說替換成沒有where子句的時候。欲瞭解更多參考,請參閱以下鏈接:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

謝謝你的答案提前, 阿帕德·拉約什

回答

0

在你的文檔的鏈接,他們表現出replace命令三種替代形式。即使消失,唯一可以接受where子句的是第三種形式,尾隨select

replace看起來像是相對於update矯枉過正如果我正確理解你的任務。

+0

非常感謝您的回答。事實上,這是一個矯枉過正,你是絕對正確的,我只是想知道,如果插入有一個where子句來過濾要替換的東西,因爲我們的主機說它有,我想澄清一下(如果我已經找到出於此我沒有看到有理由不告訴他) REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT ... 如果我理解正確,那麼上面的語法就是,在哪裏說出哪裏可能出現。你說的對,但是,where子句在select – 2010-06-09 16:20:21

+0

而且替換成沒有在那裏的例子,所以,我認爲替換成沒有的地方。 – 2010-06-09 16:58:56

22

我可以看到你已經解決了你的問題,但回答你原來的問題:

REPLACE INTOWHERE條款。

REPLACE INTO語法工作正是INSERT INTO除了所有舊行具有相同主鍵或唯一鍵插入新行之前全自動刪除。

這意味着,而不是WHERE子句,您應該將主鍵添加到beeing值替換以限制您的更新。

REPLACE INTO myTable (
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 

...將提供與...相同的結果...

UPDATE myTable 
SET myColumn1 = 'value1', myColumn2 = 'value2' 
WHERE myPrimaryKey = 100; 

...或者更確切地說:

DELETE FROM myTable WHERE myPrimaryKey = 100; 
INSERT INTO myTable(
    myPrimaryKey, 
    myColumn1, 
    myColumn2 
) VALUES (
    100, 
    'value1', 
    'value2' 
); 
+1

是的,我已經完成了。我運行了一個查詢來找到一個「好」行並更新了那一行,這樣我就有了一個解決方案,但是在我解決了這個問題之後,我真的很好奇,如果我被告知是真的,並且基於從這裏和我的研究(嘗試的東西)的答案,替換成缺少一個where子句,所以,替換爲刪除+插入,所以我的索引仍然不會被優化。我只需要在那裏更新。無論如何,謝謝你的回答。 – 2010-06-16 05:57:38

+0

謝謝伊瓦爾。最有用的 – khaverim 2012-08-28 15:42:47