2014-04-01 61 views
1

是否有在MySQL執行更新當且僅當該值在我的行被分配到列X是大於或等於給相同的列優雅的溶液X的另一個值(特定)行?條件UPDATE如果NEW_VALUE <= value_from_different_row

我使用的是表2列作爲一個關鍵=>值店,我有這樣的事情:

 
key   | value 
--------------------------- 
period_a_begin | 2014-01-01 
period_a_end | 2014-01-15 
period_b_begin | 2014-01-20 
period_b_end | 2014-02-15 

我怎樣才能確保對於period_a_end新值大於或等於到period_a_begin值的值且小於或等於說我用它來更新period_a_end相同的SQL查詢period_b_begin的價值?

我使用子查詢嘗試過,但沒有成功:

 
UPDATE configtable 
SET configtable.value=:myvalue 
WHERE configtable.key="period_a_end" 
AND :myvalue >= (SELECT configtable.value FROM configtable WHERE configtable.key = "period_a_begin") 
AND :myvalue <= (SELECT configtable.value FROM configtable WHERE configtable.key = "period_b_begin"); 

我不斷收到以下錯誤:

 
You can't specify target table configtable for update in FROM clause 

雖然我明白爲什麼這個錯誤彈出,我無法找到找到一種方法來完成這項工作,而無需從我準備好的聲明中刪除整個支票。 :/

任何想法?

回答

0

這不是那麼優雅,但它應該工作。您可以使用嵌套查詢附加級別:

UPDATE configtable 
    SET configtable.value = :myvalue 
WHERE configtable.key="period_a_end" AND 
     :myvalue >= (select value from (SELECT ct.value FROM configtable ct WHERE ct.key = "period_a_begin") ct) AND 
     :myvalue <= (select value from (SELECT ct.value FROM configtable ct WHERE ct.key = "period_b_begin") ct); 
+0

謝謝,但不僅僅是這不優雅,我也不確定MySQL服務器的這種行爲是不是可以被視爲一個錯誤(因此在未來一段時間內會被修復/更改。) – user3485397

+0

@ user3485397。 。我可以體會到缺乏優雅的,但我不知道你的「錯誤」部分的意思。有或無子查詢的附加層的查詢是標準的SQL。需要第二層得到解決的錯誤在當前的MySQL實現中。 –

0

最終,我選擇使用我在PHP檢查多個查詢,包裝整臺成一個單一的SQL事務來實現。但要注意事務不能與MyISAM存儲引擎一起工作,因此您必須使用InnoDB或其他支持事務的引擎。

除了是快於存儲過程,這種解決方案也似乎更便攜(至少在數據庫端)給我。