zoukankan      html  css  js  c++  java
  • mysql通过外键级联删除

    mysql 可通过外键约束,实现数据的级联更新或者删除。

    例如有主表(员工排班表):

    CREATE TABLE `personal_schedule` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `employee_id` int(11) DEFAULT NULL COMMENT '员工id',
      `law_schedule_id` int(11) DEFAULT NULL COMMENT '规律班次ID,为0时为批量导入',
      `start_time` date DEFAULT NULL COMMENT '开始时间',
      `end_time` date DEFAULT NULL COMMENT '结束时间',
      `memo` varchar(100) DEFAULT NULL COMMENT '备注',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9666 DEFAULT CHARSET=utf8
    该表记录了员工employee_id从start_time到end_time期间的考勤班次law_schedule_id。

    从表(排班明细表)

    CREATE TABLE `personal_schedule_details` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `personal_schedule_id` int(11) NOT NULL COMMENT '个人排班id',
      `date` date DEFAULT NULL COMMENT '日期',
      `attendance_schedule_id` int(11) DEFAULT NULL COMMENT '基本班次id',
      PRIMARY KEY (`id`),
      KEY `personal_schedule_id` (`personal_schedule_id`) USING BTREE,
      CONSTRAINT `personal_schedule_details_ibfk_1` FOREIGN KEY (`personal_schedule_id`) REFERENCES `personal_schedule` (`id`) ON DELETE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=1441179 DEFAULT CHARSET=utf8
    记录的是主表中从start_time到end_time期间每一天的考勤班次(也就是主表记录时间段,从表记录每一天)

    当主表中的排班信息删除时,须同步删除期间每一天的记录。因此在从表的personal_schedule_id列创建外键,对应主表personal_schedule的id列,并设置为ON DELETE CASCADE表示串联删除。

    如果表中已有数据,创建外键时可能会报错:Cannot add or update a child row: a foreign key constraint fails...

    出现这一错误表示这两个表中有不满足外键约束的数据,即,从表中的personal_schedule_id未出现在主表personal_schedule中。可先删除不满足条件的数据再创建外键。

  • 相关阅读:
    css 中calc无效属性值问题
    Junit4 java.lang.Exception: No runnable methods
    javascript 中如何判断是否是JSON格式的字符串
    mybatis 主键UUID生成策略
    过滤器中获取返回信息
    拦截器过滤器以及serverRequest
    Controller中返回数据总结(ResponseEntity,@ResponseBody,@ResponseStatus)
    关于spring cloud接口参数的注意事项
    打印控件lodoop
    window查询端口和进程使用情况
  • 原文地址:https://www.cnblogs.com/yesok/p/12892775.html
Copyright © 2011-2022 走看看