MySQL不用Cascade delete修改子表和safe mode

MySQL不用Cascade Delete修改子表和safe mode

mysql支持级联操作,但是并非所有DBMS都支持。所以不用cascade设计这样的存储过程主要有两种方法:

  1. 删除原有的外键约束,对被参照或参照表修改,之后再将外键约束加回去。这个方法的好处是简单好理解,但是有的设备上或者数据库并不能使用。
  2. 将被参照表中要修改的部分记录下来后,增加一条要修改的内容,之后就可以正常操作参照表了。最后删除旧内容即可。

本人采用的就是后一种方法。举例如下方。Book表中的ID为主键,Borrow表中Book_ID是外键,参照了Book中的ID。想要修改Book中某一本书的ID,可以使用下列存储过程:

#设计一个存储过程,实现对 Book 表的 ID 的修改(本题要求不得使用外键定义时的
#on update cascade 选项,因为该选项不是所有 DBMS 都支持)。

DELIMITER //
DROP PROCEDURE IF EXISTS ChangeBookID;
CREATE PROCEDURE ChangeBookID(IN oldID char(8), IN newID char(8), OUT message varchar(10))
BEGIN
	DECLARE bname varchar(20);
	DECLARE bauthor varchar(10);
	DECLARE bprice float;
	DECLARE bstatus int;
        
	SELECT name, author, price, status 
	FROM Book
	WHERE ID = oldID
	INTO bname, bauthor, bprice, bstatus;
        
	INSERT INTO Book VALUE (newID, bname, bauthor, bprice, bstatus);
	UPDATE Borrow SET book_ID = newID WHERE book_ID = oldID;
	DELETE FROM Book WHERE ID = oldID;
        
	SET message = 'SUCCESS!';

END //
DELIMITER ;

MySQL workbench默认开启安全模式(safe mode),也就是说如果一次性修改多行,workbench会告诉你因为安全模式(一次只修改一行比较安全)所以操作不允许。可以在preferences->SQL Editor->Safe Updates中关闭。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值