【问题标题】:It's not possible to remove indexes无法删除索引
【发布时间】:2016-11-05 19:43:02
【问题描述】:

以下创建语句显示了我的一个 MariaDB 表的当前结构。

CREATE TABLE `councilor` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `user` BIGINT(20) NOT NULL,
    `council` INT(11) NOT NULL,
    `role` CHAR(50) NOT NULL DEFAULT 'member' COLLATE 'utf8_persian_ci',
    `cDate` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    `uDate` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
    `startDate` DATETIME NULL DEFAULT NULL,
    `endDate` DATETIME NULL DEFAULT NULL,
    `responsibility` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_persian_ci',
    `details` TEXT NULL COLLATE 'utf8_persian_ci',
    PRIMARY KEY (`id`),
    UNIQUE INDEX `userId_councilId` (`user`, `council`),
    INDEX `council_user_council_foreign` (`council`)
)
COLLATE='utf8_persian_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
AUTO_INCREMENT=11;

我需要删除唯一索引,但是尝试删除两个键中的任何一个都会失败。

ALTER TABLE `councilor`
    DROP INDEX `userId_councilId`;

/* SQL 错误 (1553): 无法删除索引 'userId_councilId': 在外键约束中需要 */

ALTER TABLE `councilor`
    DROP INDEX `council_user_council_foreign`;

/* SQL 错误 (1553): 无法删除索引 'council_user_council_foreign': 在外键约束中需要 */

删除所有表的行也无济于事。但是,如果上述脚本创建了一个新表,则不会出现此问题。

【问题讨论】:

标签: mysql foreign-keys


【解决方案1】:

你必须先删除外键约束,然后

ALTER TABLE mytable DROP FOREIGN KEY [Foreign_key_constraint_name];

然后你可以删除索引

【讨论】:

    【解决方案2】:

    18:18:46 ALTER TABLE location DROP INDEX unique_name_to_supplier 错误 代码:1553。无法删除索引“unique_name_to_supplier”:需要在 外键约束 0.063 秒

    这意味着您正在尝试删除用于 FK 的索引。

    MySQL 需要外键和引用键的索引,以便 外键检查可以很快并且不需要表扫描。在里面 引用表,必须有外键所在的索引 列按相同顺序列为第一列。这样一个 如果没有,则在引用表上自动创建索引 存在。如果您创建,此索引可能会在稍后被静默删除 另一个可用于强制外键约束的索引。 index_name,如果给定,则如前所述使用。

    http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html

    所以你需要修复:

    1.摆脱FK

    2.删除索引本身

    3.再次创建FK

    命令如下:

    #removing FK
        ALTER TABLE `location`  DROP FOREIGN KEY `FK_SUPPLIER`;
    
    #droping unique Index
        ALTER TABLE `location`  DROP INDEX `unique_name_to_supplier` ;
    
    #creating new FK with proper Index    
        ALTER TABLE `location` 
        ADD INDEX `FK_SUPPLIER_idx` (`supplier_id` ASC);
        ALTER TABLE `location` 
        ADD CONSTRAINT `FK_SUPPLIER`
          FOREIGN KEY (`supplier_id`)
          REFERENCES `supplier` (`id`)
          ON DELETE NO ACTION
          ON UPDATE NO ACTION;
    

    完整的 sql 日志:

    mysql>
    mysql> CREATE TABLE supplier (
        ->  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
        -> ) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.38 sec)
    
    mysql> CREATE TABLE location (
        ->  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        ->  name VARCHAR(10) NOT NULL,
        ->  supplier_id INT UNSIGNED NOT NULL
        -> ) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.32 sec)
    
    mysql> ALTER TABLE location ADD CONSTRAINT FK_SUPPLIER FOREIGN KEY FK_SUPPLIER (supplier_id)
        ->    REFERENCES supplier (id) ON DELETE RESTRICT ON UPDATE RESTRICT;
    Query OK, 0 rows affected (0.41 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> ALTER TABLE location ADD UNIQUE INDEX unique_name_to_supplier (supplier_id,name);
    Query OK, 0 rows affected (0.24 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> show create table location;
    +----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table    | Create Table
                                                                                                                                    |
    +----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | location | CREATE TABLE `location` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(10) NOT NULL,
      `supplier_id` int(10) unsigned NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `unique_name_to_supplier` (`supplier_id`,`name`),
      CONSTRAINT `FK_SUPPLIER` FOREIGN KEY (`supplier_id`) REFERENCES `supplier` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    
    mysql>
    mysql>
    mysql>
    mysql> ALTER TABLE `location`  DROP FOREIGN KEY `FK_SUPPLIER`;
    Query OK, 0 rows affected (0.17 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql>
    mysql> ALTER TABLE `location`  DROP INDEX `unique_name_to_supplier` ;
    Query OK, 0 rows affected (0.09 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql>
    mysql> ALTER TABLE `location`
        -> ADD INDEX `FK_SUPPLIER_idx` (`supplier_id` ASC);
    Query OK, 0 rows affected (0.08 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> ALTER TABLE `location`
        -> ADD CONSTRAINT `FK_SUPPLIER`
        ->   FOREIGN KEY (`supplier_id`)
        ->   REFERENCES `supplier` (`id`)
        ->   ON DELETE NO ACTION
        ->   ON UPDATE NO ACTION;
    Query OK, 0 rows affected (0.68 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> show create table location
        -> ;
    +----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table    | Create Table
                                                                                                                                                      |
    +----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | location | CREATE TABLE `location` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(10) NOT NULL,
      `supplier_id` int(10) unsigned NOT NULL,
      PRIMARY KEY (`id`),
      KEY `FK_SUPPLIER_idx` (`supplier_id`),
      CONSTRAINT `FK_SUPPLIER` FOREIGN KEY (`supplier_id`) REFERENCES `supplier` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    

    【讨论】:

    • 我的回答没有帮助?
    • @PHPst 你遗漏了一些东西,因为你的错误说 ` SQL Error (1553): Cannot drop index 'userId_councilId': required in a foreign key constraint */`
    • 这也是我的问题!
    • 目前你的问题没有意义
    【解决方案3】:

    您必须先删除 FOREIGN KEY 约束,然后删除索引并重新创建 FOREIGN 键。

    【讨论】:

      猜你喜欢
      • 2011-12-29
      • 2012-01-31
      • 2019-07-09
      • 2015-05-30
      • 1970-01-01
      • 2023-03-04
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多