现在有一个building表,里边有三个字段,building_id,building_name,building_name.
Field            Type         Collation        Null    Key     Default       
---------------  -----------  ---------------  ------  ------  -------   
building_id      int(11)      (NULL)           NO      UNI     (NULL)                
building_number  int(11)      (NULL)           NO      PRI     (NULL)                               
building_name    varchar(32)  utf8_general_ci  NO      PRI     (NULL)                   
还有另外一个表sql-write,里边有三个字段id(自增的),operation(varchar型),time(时间戳)
Field      Type          Collation        Null    Key     Default  Extra           
---------  ------------  ---------------  ------  ------  -------  --------------  
id         int(11)       (NULL)           NO      PRI     (NULL)   auto_increment          
operation  varchar(100)  utf8_general_ci  YES             (NULL)                           
time       timestamp     (NULL)           YES             (NULL)           
现在我的目的是:
1.在sql-write表上创建触发器
2.当building表中有记录删除时,把相应的sql语句写入sql-write中,我的sql代码如下      DELIMITER $$CREATE
    TRIGGER `testtrigger`.`delete_building` AFTER DELETE
    ON `testtrigger`.`sql-write`
    FOR EACH ROW BEGIN
    declare @building_id,
    set @building_id=OLD.building_id;
     insert into sql-write set operation='delete from building where building_id=' old.building_id and time=now();
    END$$DELIMITER ;
     
注:building表中building_id是主键,所以写入sql-write中的sql语句where后边的条件是building_id=old.building_id的我感觉思路是对的,就是不知道语法哪里错了?

解决方案 »

  1.   

    你要达到什么目的?看不懂你的SQL语句
      

  2.   

    主要是想把对第一个表的删除操作语句写入到第二个表中的operation中,因为第一个表中的building_id是唯一的,所以写入到第二个表中operation字段的delete语句(以varchar形式存)都是delete from building where 
    building_id=old.building
    我纠结的是如何把删除的数据中的building_id存起来
    不知道我说的是否清楚,麻烦您了
      

  3.   

    必须在building上建立删除触发器
      

  4.   

    update sql-write set operation=concat('delete from building where building_id=',old.building_id,' and time=',now());
      

  5.   

    哦,请问怎么把删除的记录里边的old.building_id和"delete from building where building_id="这个字符串拼接到一起写入第二个表呢?还有就是那个时间戳我知道用now(),但是同样是怎么把它写入到时间戳time字段中去呢?
    多谢!!!!
      

  6.   

    DELIMITER $$CREATE
        TRIGGER `testtrigger`.`delete_building` AFTER DELETE
        ON `testtrigger`.`sql-write`
        FOR EACH ROW BEGIN
         insert into sql-write set (operation,time) values (concat('delete from building where building_id=', old.building_id),now());
        END$$DELIMITER ;
      

  7.   

    insert into sql-write(operation) values concat('delete from building where building_id=',old.building_id,' and time=',now());
      

  8.   

    报错了,不知道为啥,我看time是关键字,就把time字段改名为optime了,所以我把一下代码执行后竟然报错了。DELIMITER $$CREATE
      TRIGGER `testtrigger`.`delete_building` AFTER DELETE
      ON `testtrigger`.`sql-write`
      FOR EACH ROW BEGIN
      insert into sql-write set (operation,optime) values (concat('delete from building where building_id=', old.building_id),now());
      END$$DELIMITER ;
    为什么呢?多谢
      

  9.   

    insert into `sql-write` set
      

  10.   

    搞定了,是把set删了就行了,还有就是表名里边不能带-号,因为是保留符号,除非用转义字符。我现在纠结贴啦
      

  11.   

    对了,还有个问题,就是我也想把building表中的插入操作写入sql-write表中,我在触发器中用了
      insert into sqlwrite  (operation,optime) values (concat('insert into building values(',new.building_id,',',new.building_number,',',''',new.building_name,'')'),now());sql-write表中operation字段的结果却是insert into building values(44,4444,',new.building_name,')
    这是为什么呢?那个单引号怎么处理?
    多谢!