2011-06-05 128 views
4
update A set x = '0' where [condition]; 

如果where條件未滿足,則不進行更新。編寫附條件插入語句

根據這一點,我想觸發另一個表中插入,但只有當更新已完成 - 即ROW_COUNT()> 0

請問有什麼可以做,在一個要求嗎?

我嘗試這樣做:

update A set x = '0' where [condition]; 

if row_count() > 0 then 

    insert into [...]; 

end if; 

這將導致一個錯誤。

PS:

的問題是在純粹的可能性阿明到執行更新,並且在一個DB-請求條件的插入。 SQL注入安全性通過使用預準備語句來保證。

+0

你能發佈完整的代碼嗎? – 2011-06-05 12:11:40

+0

沒有。代碼就足夠了。我的問題是關於如何用條件語句編寫查詢。 – Raffael 2011-06-05 12:16:01

+1

你使用的是哪個版本的mysql。另外,錯誤是什麼?如果你運行select row_count(),你會得到同樣的錯誤嗎? – Jai 2011-06-05 12:20:06

回答

4

創建像存儲過程:

DELIMITER $$ 

CREATE PROCEDURE updateA (c1 varchar) 
BEGIN 
    declare rows_affected integer; 

    UPDATE a SET x = '0' WHERE col1 = c1; 

    SELECT row_count() INTO rows_affected; 

    IF rows_affected > 0 THEN BEGIN 
    INSERT INTO ..... 
    END; END IF; 

END $$ 

DELIMITER ; 

或使用一個AFTER UPDATE觸發器

DELIMITER $$ 

CREATE TRIGGER au_a_each AFTER UPDATE ON a FOR EACH ROW 
BEGIN 
    INSERT INTO b (x,a_id) VALUES (new.x, new.id); 
END $$ 

DELIMITER ; 
+0

(當然+1)。感謝SP,但觸發器不會做這個伎倆有兩個原因。如果更新成功,則觸發器被調用。儘管我的更新總是會成功的,因爲不會導致錯誤。我需要一個不同的插入標準。我也需要插入用戶不能觸發的IP。 – Raffael 2011-06-06 13:12:48

+1

@Raffael,如果where子句不成立,更新觸發器不會被調用。 – Johan 2011-06-06 13:43:56

+0

真的......哦,這很有趣。我會檢查的! – Raffael 2011-06-06 14:23:42

0

你可以做兩個SQL語句,只要你的條件是相互排斥的,也就是說,如果它「允許」更新,則按定義排除插入,反之亦然。

例如

UPDATE your_table set col1 = 'x' 
where condition = <some condition here> 
; 

INSERT your_table (col1) 
select x from some_other_table where condition = <some condition here> 
; 
+2

插入沒有地方。 – Raffael 2011-06-05 12:41:34

+0

哎呦,不在那裏想!已糾正它。 – davek 2011-06-05 12:57:19