Mysql如何向存在外键的数据表中插入数据

时间:2022-12-31 14:33:05

1、创建表

CREATE TABLE `trn_comment_msg` (
  `comMsgId` int(11) NOT NULL AUTO_INCREMENT COMMENT '评论消息主键',
  `msgId` int(11) NOT NULL COMMENT '消息ID',
  `comId` int(11) NOT NULL COMMENT '课程评论ID',
  `createUserId` int(11) NOT NULL COMMENT '消息创建人Id',
  PRIMARY KEY (`comMsgId`),
  KEY `fk_comMsg_msg_idx` (`msgId`),
  KEY `fk_comMsg_com_idx` (`comId`),
  KEY `fk_trn_comment_msg_vs_usr_user_info_idx` (`createUserId`),
  CONSTRAINT `fk_comMsg_com` FOREIGN KEY (`comId`) REFERENCES `trn_course_comment` (`comId`) ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT `fk_comMsg_msg` FOREIGN KEY (`msgId`) REFERENCES `sys_msg` (`msgId`) ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT `fk_trn_comment_msg_vs_usr_user_info_on_createUserId` FOREIGN KEY (`createUserId`) REFERENCES `sys_user` (`userId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=189 DEFAULT CHARSET=utf8 COMMENT='评论消息表';

2、新增列

ALTER TABLE `trn_comment_msg` 
ADD COLUMN `content` VARCHAR(1000) NOT NULL COMMENT '消息内容' AFTER `createUserId`,
ADD COLUMN `courseName` VARCHAR(20) NOT NULL COMMENT '课程名称' AFTER `content`;

3、历史数据迁移

-- trn_course_comment历史数据迁移
update trn_comment_msg tcm
inner join trn_course_comment tcc on tcm.comId=tcc.comId
inner join trn_course tc on tc.courseId=tcc.courseId
set tcm.content=tcc.content,tcm.courseName=tc.courseName

4、新增数据

1、向trn_course_comment表新增数据,必须保证其关联的外键表`trn_course_comment`,`sys_msg`,`sys_user`中的comId,msgId,userId存在trn_course_comment表要新增的数据,否则报外键异常

2、暂时关闭外键约束,新增数据后在打开

SET SQL_SAFE_UPDATES=0SET FOREIGN_KEY_CHECKS=0;

注意此方案插入数据时可能会存在含有外键约束的字段数据不匹配的情况