2 aguo718 aguo718 于 2017.09.04 10:53 提问

在mysql5.7中实现级联删除,即删除主表中信息的同时删除参照表中对应记录,求大神指导

参照表中设置了级联删除和级联更新但是没有实现。。
上网搜索后用触发器如下

 CREATE TRIGGER deleUser_trigger
BEFORE DELETE ON users FOR EACH ROW 
BEGIN
 DELETE FROM stuinfo WHERE stu_id=old.id;
END;

然后。。。报错

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

mysql版本5.7
不知道该怎么解决,新手求指导
(另外这一过程也可以在java中实现,但觉得在数据库中实现更好些,所以想在问一下,这两种实现方式有哪些区别吗,是减少java中代码量吗)

4个回答

xjn20144206177xjn
xjn20144206177xjn   2017.09.04 11:46
已采纳

可以设置外键约束吧

图片说明

  1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。
  2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。
  3. NO ACTION: InnoDB拒绝删除或者更新父表。
  4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
aguo718
aguo718 我写了个重复的外键,第一个设置了cascade,第二个没有设置,把第二个删了就没事了,谢谢
3 个月之前 回复
cyjdapao
cyjdapao   2017.09.04 11:32

在数据库写的话效率会更高些,安全性也会更好
DROP TRIGGER IF EXISTS 触发器名字;
CREATE TRIGGER del_触发器名字
AFTER DELETE ON 主表
FOR EACH ROW
BEGIN
delete from 外键管理表 where 关联表被关联字段=old.主表的外键ID;
END;

cyjdapao
cyjdapao 那就可能是软件问题,用Navicat for Mysql试试
3 个月之前 回复
aguo718
aguo718 触发器总是说有语法错误
3 个月之前 回复
smile130
smile130   2017.09.04 11:24

你找一下第四行,看看语法问题,stu.id也加上表名试试

aguo718
aguo718 还是报错。。
3 个月之前 回复
aguo718
aguo718   2017.09.04 17:41

触发器建立一直报错

CREATE TRIGGER deleUser_trigger
AFTER DELETE ON users FOR EACH ROW 
begin
 DELETE FROM stuinfo WHERE stuinfo.stu_id=old.id;
end

报错显示为 end附近错误
网上搜了搜后,好像是少了分隔符,加上分割符后:

DELIMITER  //
 CREATE TRIGGER deleUser_trigger
AFTER DELETE ON users FOR EACH ROW 
begin
 DELETE FROM stuinfo WHERE stuinfo.stu_id=old.id;
end;  //
DELIMITER

。。还是报错
接着搜。。。。。。。
最后删除了begin...end不用分隔符成功建立

但还是疑惑有begin...end和delimiter为什么不能成功创建,希望路过的大神可以指导

Csdn user default icon
上传中...
上传图片
插入图片