2012-02-18 69 views
1

我試圖創建一個從產品表中簡單的INSERT觸發器來ProductPrice表創建插入時,SQL失敗,並沒有錯誤消息:與MySQL觸發

CREATE TRIGGER productTrigger AFTER INSERT ON Products 
    FOR EACH ROW 
BEGIN 
    INSERT INTO ProductPriceHistory (CURRENT_DATE(), CURRENT_USER(), productCode, productName, productLine, productVendor, quantityInStock, buyPrice) 
    VALUES (productCode, productName, productLine, productVendor, quantityInStock, buyPrice); 
END 

回答

2

要引用新插入的行的值,請使用NEW關鍵字,並將函數調用用作值,而不是列名;

CREATE TRIGGER productTrigger AFTER INSERT ON Products 
    FOR EACH ROW 
BEGIN 
    INSERT INTO ProductPriceHistory (log_date, log_user, productCode, 
     productName, productLine, productVendor, quantityInStock, buyPrice) 
    VALUES (CURRENT_DATE(), CURRENT_USER(), NEW.productCode, NEW.productName, 
     NEW.productLine, NEW.productVendor, NEW.quantityInStock, NEW.buyPrice); 
END 
+0

我最終在文檔中找到了這個。感謝您的收穫,我如何添加兩個觸發器,以便當他們是產品中的新記錄並且列更改時插入? – Warz 2012-02-19 00:24:25

+0

@Warz用一個新名字添加完全相同的觸發器,並用'AFTER UPDATE'替換'AFTER INSERT',你應該得到這個效果。 Afaik沒有捷徑爲兩個事件添加相同的觸發器,除了定義兩次。 – 2012-02-19 00:35:34

+0

我試過了,mysql給我 - 錯誤:這個版本的MySQL還不支持'具有相同動作時間和事件的多個觸發器'一個表' – Warz 2012-02-19 00:38:21

0

嘗試移動你的函數調用到VALUES

INSERT INTO ProductPriceHistory (date_column_name, user_column_name, productCode, productName, productLine, productVendor, quantityInStock, buyPrice) 
VALUES (current_date(), current_user(), new.productCode, new.productName, new.productLine, new.productVendor, new.quantityInStock, new.buyPrice); 

我編了date_column_nameuser_column_name的名字,你必須提供真實的名字。括號內的列表如下,表名應包含列名稱,而不是列值。你可能需要在VALUESnew.的前面添加列名,以告訴MySQL從新插入的行(在觸發器中稱爲new)中提取那些列。