MySQL无法删除外键约束中所需的索引

我需要更改现有数据库以添加列。 因此,我还想更新UNIQUE字段以包含该新列。 我试图删除当前索引但仍然收到错误MySQL Cannot drop index needed in a foreign key constraint

CREATE TABLE mytable_a (

ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,

Name VARCHAR(255) NOT NULL,

UNIQUE(Name)

) ENGINE=InnoDB;

CREATE TABLE mytable_b (

ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,

Name VARCHAR(255) NOT NULL,

UNIQUE(Name)

) ENGINE=InnoDB;

CREATE TABLE mytable_c (

ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,

Name VARCHAR(255) NOT NULL,

UNIQUE(Name)

) ENGINE=InnoDB;

CREATE TABLE `mytable` (

`ID` int(11) NOT NULL AUTO_INCREMENT,

`AID` tinyint(5) NOT NULL,

`BID` tinyint(5) NOT NULL,

`CID` tinyint(5) NOT NULL,

PRIMARY KEY (`ID`),

UNIQUE KEY `AID` (`AID`,`BID`,`CID`),

KEY `BID` (`BID`),

KEY `CID` (`CID`),

CONSTRAINT `mytable_ibfk_1` FOREIGN KEY (`AID`) REFERENCES `mytable_a` (`ID`) ON DELETE CASCADE,

CONSTRAINT `mytable_ibfk_2` FOREIGN KEY (`BID`) REFERENCES `mytable_b` (`ID`) ON DELETE CASCADE,

CONSTRAINT `mytable_ibfk_3` FOREIGN KEY (`CID`) REFERENCES `mytable_c` (`ID`) ON DELETE CASCADE

) ENGINE=InnoDB;

mysql> ALTER TABLE mytable DROP INDEX AID;

ERROR 1553 (HY000): Cannot drop index 'AID': needed in a foreign key constraint

user391986 asked 2019-07-01T11:16:00Z

6个解决方案

178 votes

你必须删除外键。 MySQL中的外键自动在表上创建索引(关于该主题有一个SO问题)。

ALTER TABLE mytable DROP FOREIGN KEY mytable_ibfk_1 ;

Brian Fisher answered 2019-07-01T11:16:16Z

61 votes

步骤1

列出外键(注意它与索引名称不同)

SHOW CREATE TABLE

结果将显示外键名称。

格式:

CONSTRAINT `FOREIGN_KEY_NAME` FOREIGN KEY (`FOREIGN_KEY_COLUMN`) REFERENCES `FOREIGN_KEY_TABLE` (`id`),

第2步

删除(外键/主键/键)键

ALTER TABLE

第3步

删除索引。

Abhishek Goel answered 2019-07-01T11:17:22Z

15 votes

如果你的意思是你可以这样做:

CREATE TABLE mytable_d (

ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,

Name VARCHAR(255) NOT NULL,

UNIQUE(Name)

) ENGINE=InnoDB;

ALTER TABLE mytable

ADD COLUMN DID tinyint(5) NOT NULL,

ADD CONSTRAINT mytable_ibfk_4

FOREIGN KEY (DID)

REFERENCES mytable_d (ID) ON DELETE CASCADE;

> OK.

但是之后:

ALTER TABLE mytable

DROP KEY AID ;

给出错误。

您可以删除索引并在一个ALTER TABLE语句中创建一个新索引:

ALTER TABLE mytable

DROP KEY AID ,

ADD UNIQUE KEY AID (AID, BID, CID, DID);

ypercubeᵀᴹ answered 2019-07-01T11:18:05Z

6 votes

因为你必须在外键字段上有一个索引,所以你可以在字段上创建一个简单的索引' AID'

CREATE INDEX aid_index ON mytable (AID);

然后才删除唯一索引' AID'

ALTER TABLE mytable DROP INDEX AID;

Eli DM answered 2019-07-01T11:18:39Z

2 votes

外键始终需要索引。 如果没有索引强制执行约束,则需要对引用表中的每个插入或更新的密钥在引用的表上进行全表扫描。 这将产生令人无法接受的性能影响。这有以下两个后果:

创建外键时,数据库会检查索引是否存在。 如果不是,则将创建索引。 默认情况下,它将与约束具有相同的名称。

当只有一个索引可以用于外键时,它不能被删除。 如果您真的不想删除它,则必须先删除外键约束或为其创建另一个索引。

Stefan Mondelaers answered 2019-07-01T11:19:32Z

1 votes

我认为这是放弃索引的简单方法。

set FOREIGN_KEY_CHECKS=1;

ALTER TABLE mytable DROP INDEX AID;

set FOREIGN_KEY_CHECKS=0;

Ram E Sh answered 2019-07-01T11:19:58Z

删除 索引 外键 mysql_MySQL无法删除外键约束中所需的索引相关推荐

  1. java删除指定索引元素_将对象/元素添加到列表中的Java指定索引处

    java删除指定索引元素 We have to create a List and add objects/elements to the List and given indexes in java ...

  2. 数据库工作笔记/设计思路-通过增加索引表为某库中其他表添加索引(描述信息)

    目录 基本概念 演示 基本概念 在设计数据库的时候,通常会增加一个索引表,提供了索引的作用,比如在某一个数据库中,通过一个索引表可以找到这个数据库中的所有表,可以通过外键关联,也可以不通过外键关联(如 ...

  3. mysql不能删除外键吗,MySQL不能删除外键约束所需的索引

    MySQL不能删除外键约束所需的索引 我需要改变现有的数据库添加一列. 因此我也想更新UNIQUE字段来包含这个新列. 我试图删除当前的索引,但不断收到错误MySQL Cannot drop inde ...

  4. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  5. 为什么在mysql执行删除表中外键的语句,外键却仍然存在? [问题点数:40分]

    1.MYSQL在建外键后,会自动建一个同名的索引 2.而删除外键的时候,这个同名索引如果没被删,则MYSQL认为外键 所以你删除了外键,再查询,因为有同名索引在,因此还能看到, 如果再执行一次删除同名 ...

  6. mysql创建外键级联更新_MySQL使用外键实现级联删除与更新的方法

    本文实例讲述了MySQL使用外键实现级联删除与更新的方法.分享给大家供大家参考,具体如下: MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时 ...

  7. mysql中外键设置级联删除_MySQL中利用外键实现级联删除、更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在 创建索引的时候,可以指 ...

  8. Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)

    有一个东西一直在我脑海中是个很烦的东西,但是这东西不搞清楚会阻碍自己的前进.自己做项目demo永远只能用一张表... 所以今天还是学习了下外键希望能够搞明白一些... 百度上搜索外键的作用" ...

  9. mysql级联删除外键约束_MySQL外键设置 级联删除

    . cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 . set null方式 在父表上update/delete记录时,将子表上匹配记录的 ...

最新文章

  1. 深度学习已成强弩之末?Bengio等大牛NeurlPS2019上支招
  2. 微电网日前优化调度 。算例有代码(2)
  3. @Resource注解研究和在SAP Hybris ECP中的应用
  4. linux下解压.tar.bz2文件
  5. mysql5.7转移_mysql从5.7.17迁移到5.7.22业务报错
  6. 想要考计算机证要学,学长忠告:建议新生要考取的三类证书,不然你就虚度四年了...
  7. 字符串类习题、面试题详解(第二篇)
  8. jsp页面ajax用法,JSP页面如何使用ajax实现局部刷新
  9. 利用vue-gird-layout 制作可定制桌面 (一)
  10. mac tree命令
  11. 2021年高压电工免费试题及高压电工复审模拟考试
  12. 中望cad文字显示问号怎么办_CAD钢筋符号显示为问号怎么办?
  13. 电脑上怎样安装python,【初学者教程】在电脑上安装Python,写第一个程序
  14. 服务器进pe后找不到硬盘,u盘进入pe后看不到硬盘的解决方法
  15. 兄弟连Linux(二)--Linux常用命令
  16. 视频教程-Python数据结构与算法视频教程-Python
  17. 世界尽头与冷酷仙境(村上春树)-摘录
  18. 图灵机是什么?一起来看看它的工作原理
  19. 计算机教学设计与反思,[信客教案及反思] 信息技术教案课后反思
  20. Android facebook KeyHash生成(生成发布密钥散列)

热门文章

  1. python是属于it界吗_转行IT行业,Python是不是一个好的选择?
  2. php 后台运行函数,php守护进程函数 后台执行脚本的实例详解
  3. 用MATLAB函数绘制系统的,用matlab绘制odes系统定义的函数
  4. php 获取内容页图片,织梦DEDECMS内容页获取图片URL地址的方法
  5. 【计算机组成原理】定点除法运算
  6. android 调出键盘表情_Android 软键盘和emoji表情切换方案,和微信几乎一样的体验...
  7. 【图像超分辨率】RRSGAN: Reference-Based Super-Resolution for Remote Sensing Image
  8. nginx的日志配置
  9. 【目标检测_解耦】 Revisiting the Sibling Head in Object Detector_2020
  10. 变形金刚2_变形金刚(