触发 - 在插入另一个表时更新一个表中的列

时间:2015-04-18 20:00:20

标签: php mysql triggers

所以,我有2张桌子。

一个是books,其中包含以下字段。 accno(入藏号),name(图书名称),status(已发布/未发布)

其次是total,其中包含以下字段。 name(图书名称),countbooks表格中未发布的图书数量

我有一个在books表中添加书籍的表单,默认状态为“Not Issued”。 我还有一个发行书籍的表格,即它将状态更改为“已发布”。 我有一个表格可以退还书籍,即它将状态更改回“未发布”。

我正在寻找一个触发器,每次更新total表时都会更新books表中的计数。 Count是书籍表中可用的书籍数量(未发布),不同的书籍(书籍名称)不同。

我对触发器完全不熟悉。我看起来很棒,但我似乎无法想办法实现这一点。

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

看起来像是一个库存系统,所以每次新图书进入图书馆时,您都会将库存编号存储到total表格中,当针对accnum发出图书时,库存会减少一个然后它返回它增加了一个。

在这种情况下,以下触发器应该完成工作

delimiter //
create trigger book_available after update on books
for each row 
begin
 if new.status = 'Issued' then 
  update total set `count` = `count` - 1 where name = new.book_name ;
 else
  update total set `count` = `count` + 1 where name = new.book_name ;
 end if ;
 delimiter ;

这是一个测试用例

mysql> select * from books ;
+--------+-----------+------------+
| accnum | book_name | status     |
+--------+-----------+------------+
|      1 | AA        | Not Issued |
|      2 | AA        | Issued     |
|      3 | BB        | Not Issued |
+--------+-----------+------------+
3 rows in set (0.00 sec)


mysql> select * from total ;
+------+-------+
| name | count |
+------+-------+
| AA   |    20 |
| BB   |    30 |
+------+-------+
2 rows in set (0.00 sec)

mysql> delimiter //

mysql> create trigger book_available after update on books
    -> for each row 
    -> begin
    ->  if new.status = 'Issued' then 
    ->   update total set `count` = `count` - 1 where name = new.book_name ;
    ->  else
    ->   update total set `count` = `count` + 1 where name = new.book_name ;
    ->  end if ;
    -> end ;//
Query OK, 0 rows affected (0.13 sec)
mysql> delimiter ;

mysql> update books set status = 'Issued' where accnum = 1 ;
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from total ;
+------+-------+
| name | count |
+------+-------+
| AA   |    19 |
| BB   |    30 |
+------+-------+
2 rows in set (0.00 sec)


mysql> update books set status = 'Not Issued' where accnum = 1 ;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from total ;
+------+-------+
| name | count |
+------+-------+
| AA   |    20 |
| BB   |    30 |
+------+-------+
2 rows in set (0.00 sec)