如何从外键列上的mysql表中删除唯一约束

问题描述

我只想从我的MysqL表列中删除UNIQUE Constraint,并按原样将Foreign Key Constraint保留在该列中。 work_id是外键。最初,该列应该是唯一的(一对一关系),现在不再需要。 我正在使用MysqL Ver 15.1 distrib 5.5.64-MariaDB。

DESCRIBE requests;
+---------------------+---------------------------------------+------+-----+---------+-------+
| Field               | Type                                  | Null | Key | Default | Extra |
+---------------------+---------------------------------------+------+-----+---------+-------+
| request_id          | char(32)                              | NO   | PRI | NULL    |       |
| owner               | varchar(100)                          | NO   |     | NULL    |       |
| status              | enum('PENDING','ACCEPTED','REJECTED') | YES  |     | NULL    |       |
| work_id             | char(32)                              | NO   | UNI | NULL    |       |
| response_message    | varchar(3000)                         | YES  |     | NULL    |       |
| created_date        | datetime                              | NO   |     | NULL    |       |
| last_modified_date  | datetime                              | NO   |     | NULL    |       |
+---------------------+---------------------------------------+------+-----+---------+-------+

CREATE TABLE `requests` (   
`request_id` char(32) NOT NULL,`owner` varchar(100) NOT NULL,`status` enum('PENDING','REJECTED') DEFAULT NULL,`work_id` char(32) NOT NULL,`response_message` varchar(3000) DEFAULT NULL,`created_date` datetime NOT NULL,`last_modified_date` datetime NOT NULL,PRIMARY KEY (`request_id`),UNIQUE KEY `work_id` (`work_id`),CONSTRAINT `requests_ibfk_1` FOREIGN KEY (`work_id`) REFERENCES `work` (`work_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1

我想从UNIQUE Constraint删除work_id。我做了一些搜索并执行了以下命令。

SHOW INDEX FROM requests;
+-----------------+------------+----------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table           | Non_unique | Key_name       | Seq_in_index | Column_name       | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------------+------------+----------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| requests        |          0 | PRIMARY        |            1 | request_id        | A         |          16 |     NULL | NULL   |      | BTREE      |         |               |
| requests        |          0 | work_id        |            1 | work_id           | A         |          16 |     NULL | NULL   |      | BTREE      |         |               |
+-----------------+------------+----------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

后执行

ALTER TABLE requests DROP INDEX work_id;

我遇到错误

错误1553(HY000):无法删除索引“ work_id”: 外键约束

解决方法

因此,您的问题是您要删除Foreign Key约束中使用的索引。因此,您不能直接这样做。请按照以下步骤操作:

  1. 丢弃约束requests_ibfk_1,即您的foreign key
alter table requests drop foreign key requests_ibfk_1
  1. 然后将UNIQUE KEY放在列work_id上。
alter table requests drop index work_id
  1. 再次在列Foreign Key上添加work_id
alter table requests add CONSTRAINT `requests_ibfk_1` FOREIGN KEY (`work_id`) REFERENCES `work` (`work_id`)

DEMO

,

如@Rick James 的评论中所述,替代方法是暂时禁用表的键约束,立即删除唯一索引,然后再启用表的键。以下是 mysql / mariadb 的示例:

ALTER TABLE `<YOUR_TABLE_NAME>` DISABLE KEYS;
ALTER TABLE `<YOUR_TABLE_NAME>` DROP INDEX `<YOUR_UNIQUE_INDEX_NAME>`;
ALTER TABLE `<YOUR_TABLE_NAME>` ENABLE KEYS;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...