2012-02-19 104 views
3

我的數據庫中一列的默認初始值與行自動遞增的ID相同。我試圖用觸發器來設置它。我可以使用MySQL觸發器更新剛剛添加的行嗎?

CREATE TRIGGER `default_order_value` 
AFTER INSERT ON `clusters` 
FOR EACH ROW 
BEGIN 
    UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id; 
END 

但這種不斷拋出一個語法錯誤

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5

我已經試過各種排列這與沒有運氣。任何人都可以看到我做錯了什麼?

回答

7

正如zerkms說,你需要更改分隔符。但由於您只使用1行代碼,因此您不需要BEGIN和END。而這樣一來,你不需要改變分隔符要麼

CREATE TRIGGER `default_order_value` 
AFTER INSERT ON `clusters` 
FOR EACH ROW 
    UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id; 

既然你得到一個錯誤,你不能更新行,我建議如下:

完全不執行更新查詢。默認情況下,訂單值= ID值。所以當訂單價值改變時,你可以正確地更新它。

如果您要請求與PHP的數據,做這樣的事情:

$order = $row['order']; 
if ($order == '') 
    $order = $row['id']; 

後,您需要更新,你有正確的值。

+0

這很有趣,從來沒有在 – zerkms 2012-02-19 20:48:37

+0

之前看過這個語法我現在得到了以下錯誤'1442無法更新存儲的函數/觸發器中的表'簇',因爲它已經被調用此存儲函數/觸發器的語句使用。「 - 任何想法爲什麼?它甚至發生在一個非常簡單的INSERT INTO集羣(\'name \')VALUES('qweqwe')' – wheresrhys 2012-02-19 21:27:31

+0

@wheresrhys:那是因爲你不能修改你剛剛插入的行:-) – zerkms 2012-02-19 21:38:52

2

由於mysql將第5行中的;作爲觸發器聲明的結尾,所以會出現錯誤,這顯然會導致語法錯誤。

所以,你需要重新定義分隔符指定的觸發體前:

delimiter | 

CREATE TRIGGER `default_order_value` 
AFTER INSERT ON `clusters` 
FOR EACH ROW 
BEGIN 
    UPDATE `clusters` SET `order` = NEW.id WHERE `id` = NEW.id; 
END; 
| 

delimiter ; 
+0

大 - 非常感謝。 – wheresrhys 2012-02-19 20:49:23

6

我不認爲你可以做到這一點。

CREATE TRIGGER `default_order_value` 
AFTER INSERT ON `clusters` 
FOR EACH ROW 
    SET NEW.`order` = NEW.id ; 

導致這個錯誤:

> Error Code: 1362. Updating of NEW row is not allowed in after trigger 

你也不能使用一個AFTER INSERT觸發器不能,也不由發出UPDATE也不由這樣的修改同一個表因爲NEW.id未知(如果修改上述內容,則order列將在插入後得到0值。)


你可以做什麼,是使用事務:

START TRANSACTION ; 
    INSERT INTO clusters (id) 
    VALUES (NULL); 
    UPDATE clusters 
    SET `order` = id 
    WHERE id = LAST_INSERT_ID(); 
COMMIT ; 
+0

如何觸發此事務? – wheresrhys 2012-02-20 08:44:46

+0

我的觀點是,你不能爲此使用觸發器。您必須將整個事務替換爲Insert(如果需要,可以將其放入存儲過程中)。 – 2012-02-20 08:48:09

+0

如何編寫SP的示例:[在MySQL服務器中使用存儲過程的事務](http://khanrahim.wordpress.com/2010/05/16/transaction-with-stored-procedure-in-mysql-server/) – 2012-02-20 08:54:41

-1

這爲我工作:

CREATE TRIGGER `update_table_2` 
AFTER UPDATE ON `table_1` 
FOR EACH ROW 
UPDATE table2 
JOIN table_1 
SET table_2.the_column = NEW.the_column 
WHERE table_2.auto_increment_field = OLD.auto_increment_field 
相關問題