各位大侠,我在写几个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表的字段不能修改了!!

解决方案 »

  1.   

    set @shipid = new.shipid;
    set @projectno = new.projectno;这两句是什么意思?这两句不能成功吧..
      

  2.   

    这是设立主键的值,然后往record表里填!
    如果不这样设置,那projects表里的主键怎么得到值?
      

  3.   

    set @shipid = "new.shipid";
    set @projectno = "new.projectno";应该是这样吧..
      

  4.   

    我刚设置了set @shipid = "new.shipid";
              set @projectno = "new.projectno";
    但仍然是那个错误!!
      

  5.   

    仔细看你的程序还是挺多错误的:
    1.既然record表的id的自增长型,就不需要在insert语句里加此字段啦,难道很条记录ID都=1?主键不允许.2.@shipid+'@'+@projectno是不行的,用concat(@shipid,'@',@projectno).3.变量虽然可以不声明,但最好还是声明的好..
      

  6.   

    首先谢谢你的提示!
    record表的id,我一开始是没写,但后来在eclipse里给我报错,首先一条就是我的int为空,
    所以我无奈的情况下,才写的‘1’;你所提到的变量声明,能再详细的说明一下吗?
      

  7.   

    declare shipid varchar(10);set @shipid=...;类似于这样.
      

  8.   

    cancat是不是一次只能连接两个字符啊!
    要是多的话,需要用多个相连吧!!
      

  9.   

    brisking 你好!
    我的问题解决了!
    最好的结果是:
    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;
    //非常感谢你的帮助,但从结果上看,也有点出户人的意料,没想到竟然这样就行了!!
    不管怎么说,非常感谢你!!
      

  10.   

    呵呵。
    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 字段。