zoukankan      html  css  js  c++  java
  • MySQL中利用外键实现级联删除、更新

    一、问题

      删除有外键关联的数据或者表的时候,mysql出现报错:

      Cannot delete or update a parent row: a foreign key constraint fails

    二、解决办法——使用级联属性

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

      在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括RESTRICT、NO ACTION、SET NULL和CASCADE。

    -- RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新;
    
    -- CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录;
    
    -- SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被SET NULL。

      因为只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。下面是我创建表的过程

    -- 留言表
    DROP TABLE IF EXISTS `t_message`;
    CREATE TABLE `t_message` (
      `messageId` INT(11) NOT NULL AUTO_INCREMENT, #留言编号
      `content` VARCHAR(2000) DEFAULT NULL,        #留言内容
      `leaveWordTime` VARCHAR(55) DEFAULT NULL,     #留言时间
      `stuId` INT(11) DEFAULT NULL,           #留言学生的编号
      `replay` VARCHAR(2000) DEFAULT NULL,         #回复内容
      `replayTime` VARCHAR(50) DEFAULT NULL,       #回复时间
      PRIMARY KEY  (`messageId`)  
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;
    
     ALTER TABLE t_message ADD CONSTRAINT FK_ID FOREIGN KEY(stuId) REFERENCES t_stu(stuId) ON DELETE CASCADE ON UPDATE CASCADE;

      当然也可以使用第三方工具,比如SQLyog:

      当已经建立完了外键索引,但是没加级联删除或者级联更新,通过alter是改不了的。这时可以使用第三方工具来更改字段属性。

             

          

  • 相关阅读:
    乐乐的作业
    Spring中配置数据源的5种形式
    乐观锁和悲观锁的区别
    使用Nexus搭建Maven私服
    Maven错误记录
    Maven学习笔记(一)
    Eclipse的SVN插件下载
    SSH整合(Struts2+Spring+Hibernate)
    java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    使用mss2sql将SqlServer转换为Mysql
  • 原文地址:https://www.cnblogs.com/timetellu/p/11966476.html
Copyright © 2011-2022 走看看