各位大侠,我在写几个mysql触发器,mysql为5.2,但在写的过程中遇到了问题,但又不知道原因,希望高手帮着指点一下!首先写我建了一个record表来记录触发器的执行过程,表内容如下:CREATE TABLE RECORD (
ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
TABLE_NAME VARCHAR(100) NOT NULL,
OP_TIME datetime NOT NULL,
OP_TYPE VARCHAR(100) NOT NULL,
PK VARCHAR(100) NOT NULL,
STATUS CHAR(2) NOT NULL default '00',
STATUS_TIME datetime NULL
);
op_time 是记录事件发生时间,op_type 是记录事件类型,PK 是记录发生事件的表的主键值,主要是用来确定那条发生事件的那条信息。status和status_time可现在先不填值。我所写触发器的表是叫projects,它有两个主键,分别是shipid和projectno。所以我写的触发器为:delimiter //
create trigger t_insert after insert on projects
for each row
begin
set @shipid = new.shipid;
set @projectno = new.projectno;set @op_time=now();
insert into record (id,table_name,op_time,op_type,pk,status,status_time) values
('1','progjects',@op_time,'insert',@shipid+'@'+@projectno,'00','');
end;
//再把触发器写入projects表里后。在数据库里直接往projects表填写数据时,填不上!从web页面里往projects表填写数据,填完后就报错,而且是报‘system error’.如果把触发器去掉,那在web页面里往projects表填写数据时,系统就不报错,并且是添加成功!我实在是很郁闷,请各位高手帮忙解决一下!尤其是有多个主键的表写触发器时应该怎么处理??!!我的record表的字段不能修改了!!
ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
TABLE_NAME VARCHAR(100) NOT NULL,
OP_TIME datetime NOT NULL,
OP_TYPE VARCHAR(100) NOT NULL,
PK VARCHAR(100) NOT NULL,
STATUS CHAR(2) NOT NULL default '00',
STATUS_TIME datetime NULL
);
op_time 是记录事件发生时间,op_type 是记录事件类型,PK 是记录发生事件的表的主键值,主要是用来确定那条发生事件的那条信息。status和status_time可现在先不填值。我所写触发器的表是叫projects,它有两个主键,分别是shipid和projectno。所以我写的触发器为:delimiter //
create trigger t_insert after insert on projects
for each row
begin
set @shipid = new.shipid;
set @projectno = new.projectno;set @op_time=now();
insert into record (id,table_name,op_time,op_type,pk,status,status_time) values
('1','progjects',@op_time,'insert',@shipid+'@'+@projectno,'00','');
end;
//再把触发器写入projects表里后。在数据库里直接往projects表填写数据时,填不上!从web页面里往projects表填写数据,填完后就报错,而且是报‘system error’.如果把触发器去掉,那在web页面里往projects表填写数据时,系统就不报错,并且是添加成功!我实在是很郁闷,请各位高手帮忙解决一下!尤其是有多个主键的表写触发器时应该怎么处理??!!我的record表的字段不能修改了!!
set @projectno = new.projectno;这两句是什么意思?这两句不能成功吧..
如果不这样设置,那projects表里的主键怎么得到值?
set @projectno = "new.projectno";应该是这样吧..
set @projectno = "new.projectno";
但仍然是那个错误!!
1.既然record表的id的自增长型,就不需要在insert语句里加此字段啦,难道很条记录ID都=1?主键不允许.2.@shipid+'@'+@projectno是不行的,用concat(@shipid,'@',@projectno).3.变量虽然可以不声明,但最好还是声明的好..
record表的id,我一开始是没写,但后来在eclipse里给我报错,首先一条就是我的int为空,
所以我无奈的情况下,才写的‘1’;你所提到的变量声明,能再详细的说明一下吗?
要是多的话,需要用多个相连吧!!
我的问题解决了!
最好的结果是:
delimiter //
create trigger t_insert after insert on projects
for each row
begin
insert into record(table_name,op_time,op_type,pk) values
('projects',@op_time,'insert',concat(@shipid,'@',@projectno));
end;
//非常感谢你的帮助,但从结果上看,也有点出户人的意料,没想到竟然这样就行了!!
不管怎么说,非常感谢你!!
delimiter //
create trigger t_insert after insert on projects
for each row
begin
set @shipid = new.shipid;
set @projectno = new.projectno;set @op_time=now(); --这行不知道对不对。
insert into record (id,table_name,op_time,op_type,pk,status,status_time) values
('1','progjects',@op_time,'insert',@shipid+'@'+@projectno,'00',''); --如果这句insert没有问题的话,楼主应该可以试试。
end //
DELIMITER ;projects 表要有shipid 和 projectno 字段。