2014-10-09 12 views
0

嗨我的mysql觸發語法有問題,我希望它在NEW transaction_id上更新我的copy_instock行,當電影被僱傭從copy_instock中減去1時,則在電影返回時將其更新爲將1加回到copy_instock。或者我怎樣才能以不同於MySql的方式實現這一點。 我的表是低於我的觸發器是不正確的mysql觸發器添加或減少庫存數量,當項目被僱用時減1並且當項目返回時增加1

CREATE TABLE IF NOT EXISTS `hires` (
`transaction_id` int(11) NOT NULL, 
`movie_id` int(11) NOT NULL, 
`customer_id` int(11) NOT NULL, 
`hire_cost` double(4,2) NOT NULL DEFAULT '3.00', 
`date_hired` date DEFAULT NULL, 
`days_hire` int(11) NOT NULL DEFAULT '1', 
`date_returned` date DEFAULT NULL, 
`total_cost` double(4,2) DEFAULT NULL, 
`copy_instock` int(3) NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; 



CREATE TRIGGER update_instock AFTER INSERT ON hires 
FOR EACH ROW 
BEGIN 
if (date_returned != NULL) { 
UPDATE hires SET (NEW.copy_instock = OLD.copy_instock - 1) 
} 
Elseif (date_returned != date) { 
UPDATE hires SET (NEW.copy_instock = OLD.copy_instock + 1) 
END 
+0

壞主意。如果有人做'更新員工設置copy_instock = 50 kajillion',而你以前只有3個庫存?現在你有50 kajillion + 1的股票價值。觸發器應該簡單地更新原始值+/- 1,不會取得更新的值並修改它。 – 2014-10-09 17:11:55

+0

一旦設置了5份,我希望它在聘用和返回時自動調整。這就是我想要這個觸發器消除人爲錯誤的原因,正如你評論的那樣。我在web dev dp.course中做這個評估。感謝您的評論 – Vasko 2014-10-09 17:17:31

回答

1

您需要設置德分隔符

DELIMITER $$ 

CREATE TRIGGER update_instock AFTER INSERT ON hires 
FOR EACH ROW 
BEGIN 
-- your code 
END$$ 

DELIMITER ; 
+0

#1363 - 沒有老行在INSERT觸發器 - 這就是我得到的錯誤,我想我需要一個函數來填充copy_instock從前分鐘總計爲該特定電影被聘用首先應用這個觸發器,因爲創建新記錄時它是空白的,我想這就是爲什麼它現在給我沒有舊行錯誤 – Vasko 2014-10-09 18:55:31

+0

如何在插入行時獲取copy_instock? – Gervs 2014-10-09 19:15:41

+0

「SELECT movie_id,MIN(copy_instock)FROM hires」給我所有錄製的電影和copy_instock。謝謝 – Vasko 2014-10-09 19:40:04

0

應該有代碼中沒有{}。正確的語法是:

IF ... THEN 
    ... 
ELSEIF ... THEN 
    ... 
END IF; 

也未嘗= NULL將retrun錯誤的價值觀,應該是:

something IS NLLL 

something IS NOT NULL 

Reference

我不知道,如果這是你試圖達到的目標,但它已經更正了語法:

CREATE TRIGGER update_instock AFTER INSERT ON hires 
FOR EACH ROW 
BEGIN 
    IF (date_returned IS NULL) THEN 
     UPDATE hires SET NEW.copy_instock = OLD.copy_instock - 1; 
    ELSEIF (date_returned IS NOT NULL) THEN 
     UPDATE hires SET NEW.copy_instock = OLD.copy_instock + 1; 
    END IF; 
END 
+0

我現在試試,謝謝 – Vasko 2014-10-09 17:20:15

+0

它仍然給我一個語法錯誤 – Vasko 2014-10-09 17:30:06

+0

編輯,我的答案 - 你不能使用(設置後,應該有;更新後 – maszter 2014-10-09 17:40:14

相關問題