由于外键的存在引发的一个mysql问题 Cannot change column 'id': used in a foreign key constraint...

本文介绍了解决MySQL数据库中因外键约束而导致的表结构修改难题,通过删除外键约束并重新定义表的方式实现了对表结构的成功调整。
 Duplicate entry '0' for key 'PRIMARY'

一查,发现表没有设置自增长。

尝试增加修改表,添加自增长。

ALTER TABLE sh_incentive_item MODIFY id SMALLINT UNSIGNED AUTO_INCREMENT;

报错

1
2
[SQL] ALTER TABLE sh_incentive_item MODIFY id SMALLINT UNSIGNED AUTO_INCREMENT;
[Err] 1833 - Cannot change column 'id': used in a foreign key constraint 'FK_sh_incentive_item_id' of table 'storehelper.sh_incentive'

发现是因为外键的影响,不能随便的更改表结构。

要想更改表结构,首先要把基层的表修改了。

A表 作为B表的外键,A表不能随便修改。

B表 有A表的外键,必须先处理好B,然后A才能修改。

索性,我就把表中的外键全部去除。

原SQL

复制代码

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `sh_incentive`
-- ----------------------------
DROP TABLE IF EXISTS `sh_incentive`;
CREATE TABLE `sh_incentive` (
  `id` int(11) NOT NULL COMMENT '编号',
  `item_id` int(11) DEFAULT NULL COMMENT '名称',
  `agent_id` int(11) DEFAULT NULL COMMENT '关联代理商',
  `money` double(10,2) NOT NULL COMMENT '金额',
  `year` int(11) NOT NULL COMMENT '年份',
  `month` int(11) NOT NULL COMMENT '月份',
  `addtime` int(11) NOT NULL COMMENT '添加时间',
  PRIMARY KEY (`id`),
  KEY `FK_sh_incentive_item_id` (`item_id`),
  CONSTRAINT `FK_sh_incentive_item_id` FOREIGN KEY (`item_id`) REFERENCES `sh_incentive_item` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='激励设定';

-- ----------------------------
-- Records of sh_incentive
-- ----------------------------

-- ----------------------------
-- Table structure for `sh_incentive_item`
-- ----------------------------
DROP TABLE IF EXISTS `sh_incentive_item`;
CREATE TABLE `sh_incentive_item` (
  `id` int(11) NOT NULL COMMENT '编号',
  `name` varchar(255) NOT NULL COMMENT '名称',
  `intro` varchar(255) NOT NULL COMMENT '说明',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统激励项';

-- ----------------------------
-- Records of sh_incentive_item
-- ----------------------------

-- ----------------------------
-- Table structure for `sh_opener_bonus`
-- ----------------------------
DROP TABLE IF EXISTS `sh_opener_bonus`;
CREATE TABLE `sh_opener_bonus` (
  `id` int(11) NOT NULL COMMENT '编号',
  `opener_id` int(11) DEFAULT NULL COMMENT '员工编号',
  `incentive_id` int(11) DEFAULT NULL COMMENT '激励条件id',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注说明',
  `addtime` int(11) DEFAULT NULL COMMENT '记录时间',
  PRIMARY KEY (`id`),
  KEY `FK_sh_openernus_opener_id` (`opener_id`),
  KEY `FK_sh_openernus_incentive_id` (`incentive_id`),
  CONSTRAINT `FK_sh_openernus_incentive_id` FOREIGN KEY (`incentive_id`) REFERENCES `sh_incentive` (`id`),
  CONSTRAINT `FK_sh_openernus_opener_id` FOREIGN KEY (`opener_id`) REFERENCES `sh_opener` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='拓展员奖金';

-- ----------------------------
-- Records of sh_opener_bonus
-- ----------------------------

-- ----------------------------
-- Table structure for `sh_opener_bonus_payment`
-- ----------------------------
DROP TABLE IF EXISTS `sh_opener_bonus_payment`;
CREATE TABLE `sh_opener_bonus_payment` (
  `id` int(11) NOT NULL COMMENT '编号',
  `opener_id` int(11) NOT NULL COMMENT '拓展员',
  `agent_id` int(11) DEFAULT NULL COMMENT '代理商',
  `money` double(10,2) NOT NULL COMMENT '金额',
  `trode_number` varchar(255) NOT NULL COMMENT '转账流水号',
  `addtime` int(11) NOT NULL COMMENT '添加时间',
  PRIMARY KEY (`id`),
  KEY `FK_sh_openerent_opener_id` (`opener_id`),
  CONSTRAINT `FK_sh_openerent_opener_id` FOREIGN KEY (`opener_id`) REFERENCES `sh_opener` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='拓展员奖金发放';

-- ----------------------------
-- Records of sh_opener_bonus_payment
-- ----------------------------
复制代码

把外键统统去掉

复制代码
-- ----------------------------
-- Table structure for `sh_opener_bonus_payment`
-- ----------------------------
DROP TABLE IF EXISTS `sh_opener_bonus_payment`;
CREATE TABLE `sh_opener_bonus_payment` (
  `id` int(11) NOT NULL COMMENT '编号',
  `opener_id` int(11) NOT NULL COMMENT '拓展员',
  `agent_id` int(11) DEFAULT NULL COMMENT '代理商',
  `money` double(10,2) NOT NULL COMMENT '金额',
  `trode_number` varchar(255) NOT NULL COMMENT '转账流水号',
  `addtime` int(11) NOT NULL COMMENT '添加时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='拓展员奖金发放';

-- ----------------------------
-- Table structure for `sh_opener_bonus`
-- ----------------------------
DROP TABLE IF EXISTS `sh_opener_bonus`;
CREATE TABLE `sh_opener_bonus` (
  `id` int(11) NOT NULL COMMENT '编号',
  `opener_id` int(11) DEFAULT NULL COMMENT '员工编号',
  `incentive_id` int(11) DEFAULT NULL COMMENT '激励条件id',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注说明',
  `addtime` int(11) DEFAULT NULL COMMENT '记录时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='拓展员奖金';

-- ----------------------------
-- Records of sh_opener_bonus
-- ----------------------------

-- ----------------------------
-- Table structure for `sh_incentive`
-- ----------------------------
DROP TABLE IF EXISTS `sh_incentive`;
CREATE TABLE `sh_incentive` (
  `id` int(11) NOT NULL COMMENT '编号',
  `item_id` int(11) DEFAULT NULL COMMENT '名称',
  `agent_id` int(11) DEFAULT NULL COMMENT '关联代理商',
  `money` double(10,2) NOT NULL COMMENT '金额',
  `year` int(11) NOT NULL COMMENT '年份',
  `month` int(11) NOT NULL COMMENT '月份',
  `addtime` int(11) NOT NULL COMMENT '添加时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='激励设定';

-- ----------------------------
-- Records of sh_incentive
-- ----------------------------

-- ----------------------------
-- Table structure for `sh_incentive_item`
-- ----------------------------
DROP TABLE IF EXISTS `sh_incentive_item`;
CREATE TABLE `sh_incentive_item` (
  `id` int(11) NOT NULL COMMENT '编号',
  `name` varchar(255) NOT NULL COMMENT '名称',
  `intro` varchar(255) NOT NULL COMMENT '说明',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统激励项';

-- ----------------------------
-- Records of sh_incentive_item
-- ----------------------------
复制代码

上面的顺序很重要哦。顺序有误,就不能执行成功!

 

处理好后,就可以添加自增长了。


本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/5019947.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值