3

以下是我的表架构:

+--------------+--------------+------+-----+---------+-------+
| 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;

但给了我一个错误 -

错误 1362 (HY000):在触发器后不允许更新新行 错误 1193 (HY000):未知系统变量 'DLNO' 错误 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“END”附近使用正确的语法

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

提前致谢!

4

2 回答 2

4

不要忘记更改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 ;
于 2013-04-22T09:27:11.630 回答
2

请在 mysql 触发器上查看此链接。当您想对正在输入的当前行进行更新时,您不能使用 after 子句。

检查http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html 当你想使用

SET NEW.col_name = value

在您的触发器中,请注意您不能将其与 AFTER 操作一起使用,而必须在操作之前使用它。

因此,这将起作用:

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
;

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

于 2013-04-22T09:33:55.553 回答