如何从外键列上的 mysql table 删除唯一约束
How to drop unique constraint from mysql table on a foreign key column
我只想从我的 MySQL table 列中删除 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','ACCEPTED','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
我想从 work_id
中删除 UNIQUE Constraint
。我做了一些搜索并执行了以下命令。
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;
我收到一个错误
ERROR 1553 (HY000): Cannot drop index 'work_id': needed in a
foreign key constraint
所以,您的问题是您试图删除在 Foreign Key
约束中使用的索引。所以你不能直接这样做。按照以下步骤操作:
- 删除约束
requests_ibfk_1
,这是您的 foreign key
。
alter table requests drop foreign key requests_ibfk_1
- 然后将
UNIQUE KEY
拖放到 work_id
列。
alter table requests drop index work_id
- 再次在列
work_id
上添加 Foreign Key
。
alter table requests add CONSTRAINT `requests_ibfk_1` FOREIGN KEY (`work_id`) REFERENCES `work` (`work_id`)
如@Rick James 的评论所述,替代方法是暂时禁用 table 的键约束,立即删除唯一索引,然后启用 table 的键。这是 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;
问题是唯一约束的定义删除了通常为外键创建的索引。但是还有另一种方法,无需重新创建外键约束或(暂时)禁用检查(这可能导致一致性错误)。
首先,为同一列添加另一个索引(出于逻辑原因,我将其完全命名为外键):
CREATE INDEX requests_ibfk_1 ON requests(work_id);
现在您可以安全地删除唯一 constraint/index(因为外键约束仍然有可用的索引):
DROP INDEX work_id ON requests;
我希望这能解决问题。
我只想从我的 MySQL table 列中删除 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','ACCEPTED','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
我想从 work_id
中删除 UNIQUE Constraint
。我做了一些搜索并执行了以下命令。
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;
我收到一个错误
ERROR 1553 (HY000): Cannot drop index 'work_id': needed in a foreign key constraint
所以,您的问题是您试图删除在 Foreign Key
约束中使用的索引。所以你不能直接这样做。按照以下步骤操作:
- 删除约束
requests_ibfk_1
,这是您的foreign key
。
alter table requests drop foreign key requests_ibfk_1
- 然后将
UNIQUE KEY
拖放到work_id
列。
alter table requests drop index work_id
- 再次在列
work_id
上添加Foreign Key
。
alter table requests add CONSTRAINT `requests_ibfk_1` FOREIGN KEY (`work_id`) REFERENCES `work` (`work_id`)
如@Rick James 的评论所述,替代方法是暂时禁用 table 的键约束,立即删除唯一索引,然后启用 table 的键。这是 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;
问题是唯一约束的定义删除了通常为外键创建的索引。但是还有另一种方法,无需重新创建外键约束或(暂时)禁用检查(这可能导致一致性错误)。
首先,为同一列添加另一个索引(出于逻辑原因,我将其完全命名为外键):
CREATE INDEX requests_ibfk_1 ON requests(work_id);
现在您可以安全地删除唯一 constraint/index(因为外键约束仍然有可用的索引):
DROP INDEX work_id ON requests;
我希望这能解决问题。