2013-04-22 126 views
3

以下是我的表模式:使用多線兩列組合成一個觸發器在MySQL

+--------------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+--------------+--------------+------+-----+---------+-------+ 
| LicenceID | int(11)  | NO | PRI | NULL |  | 
| PassingRTO | varchar(4) | NO |  | NULL |  | 
| DLNO   | int(15)  | YES |  | NULL |  | 
| DateOfIssue | date   | NO |  | NULL |  | 
| DateOfExpiry | date   | NO |  | NULL |  | 
| COV   | varchar(6) | NO |  | NULL |  | 
| DateOfBirth | date   | NO |  | NULL |  | 
| BloodGroup | varchar(3) | YES |  | NULL |  | 
| FullName  | varchar(50) | NO |  | NULL |  | 
| FathersName | varchar(50) | YES |  | NULL |  | 
| Address  | varchar(150) | NO |  | NULL |  | 
| PinCode  | int(6)  | NO |  | NULL |  | 
| IssuingAuth | int(7)  | NO |  | NULL |  | 
| IDIA   | int(11)  | YES |  | NULL |  | 
| Valid  | tinyint(4) | NO |  | NULL |  | 
+--------------+--------------+------+-----+---------+-------+ 

什麼我想要做的是,當我插入新行,我希望我的DLNO作爲PassingRTO + LicenceID和IDIA作爲PassingRTO + IssuingAuth。

我嘗試使用相同的 -

create trigger insert_combined 
after insert on LicencesDB 
for each row 
BEGIN 
set new.IDIA = concat(new.PassingRTO, new.IssuingAuth); 
set new.DLNO = concat(new.PassingRTO,new.LicenceID); 
END; 

,但給了我一個錯誤 -

ERROR 1362(HY000):新行的更新是不允許在後 觸發ERROR 1193( HY000):未知的系統變量「DLNO」錯誤1064 (42000):您的SQL語法有錯誤;檢查手冊中 對應於你的MySQL服務器版本正確的語法在行使用 附近「END」 1

現在我有兩個問題,我們可以做這個觸發器使用多行?我們不能在創建表本身時組合兩列嗎?像col1 = col2 + col3?

在此先感謝!

回答

3

不;噸忘記改變MySQL的觸發器DELIMITER

DELIMITER $$ 
create trigger insert_combined 
after insert on LicencesDB 
for each row 
BEGIN 
set new.IDIA = concat(new.PassingRTO, new.IssuingAuth); 
set new.DLNO = concat(new.PassingRTO,new.LicenceID); 
END $$ 
DELIMITER ; 
+0

對不起,我對分隔符沒有任何意見,請您解釋一下嗎? – Shashank 2013-04-22 09:33:13

+0

對不起我的壞..忘了改變列的dataType!現在工作好了! :) – Shashank 2013-04-22 10:46:50

2

請檢查該鏈接。如果您想對正在輸入的當前行進行更新,則不能使用after子句。

檢查http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html 當你想在你的觸發器使用

SET NEW.col_name = value 

,請注意,你不能用用這個動作之後,並且必須使用它的動作之前。

因此,這將工作:

CREATE TRIGGER sdata_insert BEFORE INSERT ON `sometable` 
FOR EACH ROW 
BEGIN 
SET NEW.guid = UUID(); 
END 
; 

這樣就不會工作:

CREATE TRIGGER sdata_insert AFTER INSERT ON `sometable` 
FOR EACH ROW 
BEGIN 
SET NEW.guid = UUID(); 
END 
; 

而且你也許可以做到這一點的代碼本身甚至進入數據庫之前。