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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDSClaw,2核4GB
简介:
 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,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
关系型数据库 MySQL
MySQL自增ID用完会怎样?
MySQL自增ID用完会怎样?
|
人工智能 关系型数据库 MySQL
解决MySQL自增id用尽的问题
本文介绍了解决文章点击记录表(`article_click_record`)数据量激增问题的方案。由于用户量大,每天新增约400万条记录,导致表id接近溢出(2,100,000,000),且占用空间超320G。解决方案包括:1) 新建`article_click_record_new`表,将id类型改为BIGINT以避免溢出;2) 过渡阶段同时写入新旧表,待旧表id溢出后切换至新表;3) 定时清理过期数据或转移旧表内容。实现方式涉及修改相关接口和服务逻辑,确保业务平稳过渡。
281 5
|
SQL 关系型数据库 MySQL
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
2050 56
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
|
存储 关系型数据库 MySQL
MySQL主键谁与争锋:MySQL为何钟爱自增主键ID+UUID?
本文深入探讨了在MySQL中使用自增类型主键的优势与局限性。自增主键通过保证数据的有序性和减少索引维护成本,提升了查询和插入性能,简化了数据库管理和维护,并提高了数据一致性。然而,在某些业务场景下,如跨表唯一性需求或分布式系统中,自增主键可能无法满足要求,且存在主键值易预测的安全风险。因此,选择主键类型时需综合考虑业务需求和应用场景。
540 2
|
SQL 关系型数据库 MySQL
MySQL中外键的使用及外键约束策略
这篇文章讨论了MySQL中使用外键的重要性,包括外键的概念、不使用外键可能导致的问题、如何设置外键约束以及不同的外键约束策略(如CASCADE和SET NULL),并通过示例演示了这些概念。
MySQL中外键的使用及外键约束策略
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
732 3
|
存储 监控 关系型数据库
MySQL自增ID耗尽解决方案:应对策略与实践技巧
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种特殊的属性,用于自动为新插入的行生成唯一的标识符。然而,当自增ID达到其最大值时,会发生什么?又该如何解决?本文将探讨MySQL自增ID耗尽的问题,并提供一些实用的解决方案。
631 1
|
Ubuntu 关系型数据库 MySQL
ubuntu使用aliyun源+mysql删除有外键约束的数据+查看特定目录的大小
ubuntu使用aliyun源+mysql删除有外键约束的数据+查看特定目录的大小
240 4
|
关系型数据库 MySQL 测试技术
MySQL外键使用的考量与建议
综上所述,虽然MySQL的外键提供了一种强大的工具来维护数据之间的一致性和完整性,但在决定是否使用外键时,需要权衡其带来的好处和潜在的性能影响。通过仔细的规划和测试,可以最大化地利用外键的优势,同时避免一些常见的陷阱。
246 3

推荐镜像

更多
下一篇
开通oss服务