触发器将每个插入或更新保存到表中作为日志

时间:2014-08-23 15:48:12

标签: mysql sql

我有一个名为customer

的表
id   share
1      5
2      2
3      4

,这里的id是主号码

并将此表称为详细信息

其中id不是主键,并保存所有内容,无论是插入还是更新

id   share     date
1     2        22/4/2014
2     1        23/4/2014
1     2        24/42014
3     2        25/4/2014
1     1        26/4/2014
2     1        27/4/2014

等等

当我想插入新的id应该保存到另一个表id和共享值 当我想要更新现有值时,它必须向详细信息表插入什么是值更新而不是总数

可以通过将其链接到c#或其他shell>>>来完成。但在这里,我们可以做到这一点,,,请帮助

2 个答案:

答案 0 :(得分:1)

这应该让你开始:

小提琴示范: http://sqlfiddle.com/#!9/35020/1/0

考虑以下一系列DDL / DML语句: (创建触发器和详细信息表对您来说很重要,因为您的客户表已经存在)

delimiter //

create table customer
(
 id int,
 share int,
 constraint id_pk primary key (id)
)//

insert into customer values
(1, 5),
(2, 2),
(3, 4)//

create table detail
(
 log_id int not null auto_increment,
 log_ts timestamp, customer_id int,
 customer_share int,
 action varchar(10),
   constraint log_id_pk primary key (log_id)
)//

create trigger customer_insert_log before insert on customer
    for each row begin
        insert into detail (log_ts, customer_id, customer_share, action)
             values (current_timestamp, new.id, new.share, 'INSERT');
end
//

create trigger customer_update_log before update on customer
    for each row begin
        insert into detail (log_ts, customer_id, customer_share, action)
             values (current_timestamp, new.id, new.share, 'UPDATE');
end
//

insert into customer values (4, 9),
                            (5, 3),
                            (6, 9)//

update customer set share = 3 where id = 2//

delimiter ;

如果然后针对详细信息表运行select语句(从详细信息中选择*),则得到:

| LOG_ID |                        LOG_TS | CUSTOMER_ID | CUSTOMER_SHARE | ACTION |
|--------|-------------------------------|-------------|----------------|--------|
|      1 | August, 23 2014 17:44:43+0000 |           4 |              9 | INSERT |
|      2 | August, 23 2014 17:44:43+0000 |           5 |              3 | INSERT |
|      3 | August, 23 2014 17:44:43+0000 |           6 |              9 | INSERT |
|      4 | August, 23 2014 17:44:43+0000 |           2 |              3 | UPDATE |

此详细信息表记录了完成的时间,完成的内容(插入或更新)以及当时插入(或更新为)的新值。

注意详细信息表如何显示我插入的3行,并且还捕获了我在最后运行的UPDATE。

需要注意的一点是,在创建触发器时,必须将分隔符更改为分号以外的其他分号,我使用了双斜杠(//)。

要将分隔符设置为双斜杠,请使用:

delimiter //

然后在创建触发器后,可以将其设置为分号 -

delimiter ;

答案 1 :(得分:0)

我复制过去到你的代码,但它不起作用 怎么来

出现这些错误


Msg 102,Level 15,State 1,Line 1 ' /'附近的语法不正确。 Msg 102,Level 15,State 1,Line 8 ' /'附近的语法不正确。 Msg 102,Level 15,State 1,Line 13 ' /'附近的语法不正确。 Msg 102,Level 15,State 1,Line 17 &auto -increment'附近的语法不正确。 Msg 111,Level 15,State 1,Line 24 '创造触发器'必须是查询批处理中的第一个语句。 Msg 102,Level 15,State 1,Line 29 ' /'附近的语法不正确。 Msg 102,Level 15,State 1,Line 36 ' /'附近的语法不正确。 Msg 102,Level 15,State 1,Line 40 ' /'附近的语法不正确。 Msg 102,Level 15,State 1,Line 42 ' /'附近的语法不正确。

相关问题