2011-06-14 48 views
1

編輯:這實際上工作正常,不知道爲什麼我認爲,否則。帶嵌入式IF()邏輯的REPLACE語句?

我有一個價格表,其中包括一列price_was它需要包含有史以來最高價格的價值。

是否有可能做一個REPLACE查詢,如果需要更新這個?

以下(這是簡化和動態構建在PHP中)似乎沒有工作。

REPLACE prices 
SET  price = 1.99, 
     price_was = IF(1.99 > price_was, 1.99, price_was) 
     id_product = 1 

我在想也許這是不可能的,但是很想聽聽,因爲我正在更新很多記錄,並且需要儘可能高效。

+0

當你嘗試時發生了什麼? – 2011-06-14 15:33:42

+0

@Tomalak顯然它運作良好,我認爲不然! – jezmck 2011-06-14 16:09:26

回答

2

您發佈的查詢確實有效,請自行嘗試。我會使用UPDATE,因爲您只更新一個字段,REPLACE可能會覆蓋您想單獨使用的其他列數據。

+0

你確實是對的。我不知道爲什麼我認爲它不起作用。多麼奇怪。 – jezmck 2011-06-14 16:07:12

0

嘗試INSERT ... ON DUPLICATE KEY UPDATE代替:

INSERT INTO prices (price, price_was, id_product) 
    VALUES (1.99, 1.99, 1) 
ON DUPLICATE KEY UPDATE 
    price_was = IF(VALUES(price) > price_was, VALUES(price), price_was) 
    id_product = VALUES(id_product) 

這將做任何一個INSERT或UPDATE,而REPLACE語句會那樣做一個INSERT或DELETE後插入。您無法在REPLACE語句中引用舊值,可能是因爲DELETE/INSERT語義。從the docs

值均列從 採取替換 語句中指定的值。任何缺失的列都將被設置爲默認值 ,就像 發生INSERT一樣。 您不能將 指定爲當前行的值,並且在新行中使用 。如果使用 分配諸如SET COL_NAME = COL_NAME + 1,參照 列名在右手側是 作爲DEFAULT(COL_NAME)處理,所以 分配相當於SET COL_NAME = DEFAULT (col_name)+ 1.

+1

值得注意的是,假定存在主鍵衝突 – landoncz 2011-06-14 15:32:08

+1

@landoncz - true,就像REPLACE語句一樣。 – 2011-06-14 15:56:58