2013-04-22 125 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 
; 

而且你也许可以做到这一点的代码本身甚至进入数据库之前。