+ -
当前位置:首页 → 问答吧 → Mysql 求一个删除触发器语句

Mysql 求一个删除触发器语句

时间:2011-08-29

来源:互联网

栏目表 class ,有记录a ,他包含2个子栏目 a-1,a-2 ,pid是父级栏目,children 是包含子栏目数,type是栏目属性,deep是栏目深度

 id---name---pid---children--type--deep  

  1----a------0-------2------部门---0

  2----a-1----0-1-----0------部门---1

  3----a-2----0-1-----0------部门---1

问题:怎样在删除一个子栏目(a-1)后,父级栏目a的children数 自动-1

作者: freedom_wbs   发布时间: 2011-08-29

这个并不复杂,建议参考一下手册中的例子,先自己试着写一个,然后有什么问题可以连同你的代码和错误描述一同贴上来大家一起分析。

引用
在MySQL 5.1中,可以编写包含按名称对表进行直接引用的触发程序,如下例中所示的名为testref的触发程序:

CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);

DELIMITER |

CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END
|

DELIMITER ;

INSERT INTO test3 (a3) VALUES
(NULL), (NULL), (NULL), (NULL), (NULL),
(NULL), (NULL), (NULL), (NULL), (NULL);

INSERT INTO test4 (a4) VALUES
(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
如果将下述值插入表test1,如下所示:

mysql> INSERT INTO test1 VALUES
-> (1), (3), (1), (7), (1), (8), (4), (4);
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
那么4个表中的数据如下:

mysql> SELECT * FROM test1;
+------+
| a1 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM test2;
+------+
| a2 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM test3;
+----+
| a3 |
+----+
| 2 |
| 5 |
| 6 |
| 9 |
| 10 |
+----+
5 rows in set (0.00 sec)

mysql> SELECT * FROM test4;
+----+------+
| a4 | b4 |
+----+------+
| 1 | 3 |
| 2 | 0 |
| 3 | 1 |
| 4 | 2 |
| 5 | 0 |
| 6 | 0 |
| 7 | 1 |
| 8 | 1 |
| 9 | 0 |
| 10 | 0 |
+----+------+
10 rows in set (0.00 sec)
使用别名OLD和NEW,能够引用与触发程序相关的表中的列。OLD.col_name在更新或删除它之前,引用已有行中的1列。NEW.col_name在更新它之后引用将要插入的新行的1列或已有行的1列。

激活触发程序时,对于触发程序引用的所有OLD和NEW列,需要具有SELECT权限,对于作为SET赋值目标的所有NEW列,需要具有UPDATE权限。


作者: ACMAIN_CHM   发布时间: 2011-08-29

SET children=old.children-1 WHERE type=OLD.type AND deep=old.deep-1 AND id LIKE '%old.pid';

错误码: 1193
Unknown system variable 'children'

Execution Time : 00:00:00:000
Transfer Time : 00:00:00:000
Total Time : 00:00:00:000

作者: freedom_wbs   发布时间: 2011-08-29