在mysql中使用多个行触发器将两列合并为一列

时间:2013-04-22 09:23:41

标签: 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):之后不允许更新NEW行   触发ERROR 1193(HY000):未知系统变量'DLNO'ERROR 1064   (42000):您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   在第1行'END'附近

现在我有两个问题可以在触发器中使用多行吗?并且我们不能在创建表本身时组合两列?比如col1 = col2 + col3?

提前致谢!

2 个答案:

答案 0 :(得分:3)

不要忘记更改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 ;

答案 1 :(得分:2)

请在mysql触发器上查看此链接。如果要对输入的当前行进行更新,则不能使用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
;

此外,您甚至可以在进入数据库之前在代码本身中执行此操作。