2012-01-20 45 views
2

好吧,我有一個奇怪的扭曲更新函數。由於結構的性質,我運行刪除查詢,然後插入查詢,而不是實際的「更新」查詢。它們按照該順序專門運行,以便插入的新項目不會被刪除。實質上,項目由插入查詢中匹配的屬性標識刪除。由於該屬性不是主索引,因此「ON DUPLICATE KEY UPDATE」不起作用。驗證一個查詢是否會在按相反順序執行另一個查詢之前工作

所以這裏的困境。在開發和測試過程中,刪除查詢將無失敗運行,但如果我將INSERT查詢的輸入搞亂並且失敗,那麼DATA已經被刪除而不會被重新插入,這意味着重新生成新的測試數據,甚至更糟糕的是,如果它在生產中失敗,那麼用戶將失去他們正在進行的一切。

所以,我知道MySQL在實際運行之前驗證了一個查詢,那麼是否有可能在運行DELETE查詢之前確保INSERT查詢有效?

<cfquery name="delete" datasource="DSOURCE"> 
    DELETE FROM table 
    WHERE colorid = 12 
</cfquery> 

<!--- check this query first before running delete ---> 
<cfquery name="insert" datasource="DSOURCE"> 
    INSERT INTO table (Name, ColorID) 
    VALUES ("tom", 12) 
</cfquery> 

回答

3

您有2個問題。

由於該屬性不是主索引,「ON DUPLICATE KEY UPDATE」 不起作用。

屬性不一定是PRIMARY KEY。如果它被定義爲UNIQUE KEY就足夠了,您可以不用處罰。

第二:如果你想按順序執行一系列的查詢,它們都是成功的,沒有失敗 - 這個術語是事務。要麼全部成功,要麼什麼都不發生。谷歌關於MySQL交易,以更好地瞭解如何使用它們。

+0

對不起,我應該更清楚,這是既不主,也不是唯一的。它實際上是通過一個連接表來運行的(我主要是一個Rails開發人員,所以我將它稱爲has_and_belongs_to_many關係。我現在還處於Coldfusion的早期階段,不知道CF們稱之爲什麼) –

+0

但是,它看起來像事務定我了,謝謝 –

+2

@Kyle - 歡迎:)如果你還沒有使用它,一定要使用[cfqueryparam](http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24 -7f6f.html)與所有用戶提供的參數。 – Leigh

0

既然您使用WHERE colorid = 12作爲您的刪除標準,那麼colorid必須是唯一鍵。這爲您提供了一個查詢approachng這兩種方式

UPDTAE table SET NAME="tom" 
    WHERE colorid=12 

OR

REPLACE INTO table (Name, ColorID) 
    VALUES ("tom", 12) 
相關問題