以下是我的表架构:
+--------------+--------------+------+-----+---------+-------+
| 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?
提前致谢!
答案 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
;
此外,您甚至可以在进入数据库之前在代码本身中执行此操作。