mysql触发器禁止删除_mysql如何用触发器禁止某条记录的删除、修改

本文介绍了一个使用MySQL触发器实现的库存管理系统。该系统在订单表插入数据时自动检查货物表中的库存,并根据库存情况更新货物表或抛出异常。

匿名用户

1级

2013-01-07 回答

由于 MySQL 没有直接抛出异常的语句

因此这里通过在触发器里面,插入/删除自己这个表

导致 MySQL 发生异常

发生异常了, 就会自动回滚掉 删除数据的处理了.

一个例子

货物表

CREATE TABLE Goods(

id INT,

Amount INT

);

订单表

CREATE TABLE OrderDetail(

ID INT,

GoodsID INT,

Amount INT

);

库存测试数据:

INSERT INTO Goods VALUES (1, 100);

要求:当订单表插入数据的时候,自动去货物表检查,是否有足够的库存

如果有,那么更新货物表的库存 = 原库存– 本次订单数量

如果库存不足,抱错返回.

DELIMITER //

CREATE TRIGGER BeforeInsertOrderDetail

BEFORE INSERT ON OrderDetail

FOR EACH ROW

BEGIN

DECLARE

v_nowCount INT;

SELECT

Amount INTO v_nowCount

FROM

Goods

WHERE

ID = new.GoodsID;

IF v_nowCount - new.Amount < 0 THEN

-- 由于 MySQL 没有直接抛出异常的语句

-- 因此这里通过在触发器里面,插入/删除自己这个表

-- 导致 MySQL 发生异常

DELETE FROM

OrderDetail

WHERE

ID = new.GoodsID;

ELSE

UPDATE

Goods

SET

Amount = Amount - new.Amount

WHERE

ID = new.GoodsID;

END IF;

END;

//

DELIMITER ;

处理前

mysql> select * from goods;

+------+--------+

| id | Amount |

+------+--------+

| 1 | 100 |

+------+--------+

1 row in set (0.00 sec)

mysql> select * from OrderDetail;

Empty set (0.00 sec)

mysql> INSERT INTO OrderDetail VALUES(1, 1, 90);

Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO OrderDetail VALUES(1, 1, 20);

ERROR 1442 (HY000): Can't update table 'orderdetail' in stored function/trigger

because it is already used by statement which invoked this stored function/trigg

er.

处理后

mysql> select * from goods;

+------+--------+

| id | Amount |

+------+--------+

| 1 | 10 |

+------+--------+

1 row in set (0.00 sec)

mysql> select * from OrderDetail;

+------+---------+--------+

| ID | GoodsID | Amount |

+------+---------+--------+

| 1 | 1 | 90 |

+------+---------+--------+

1 row in set (0.00 sec)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值