簡體   English   中英

如何從外鍵列上的 mysql 表中刪除唯一約束

[英]How to drop unique constraint from mysql table on a foreign key column

我只想從我的 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','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 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. 刪除作為foreign key的約束requests_ibfk_1
alter table requests drop foreign key requests_ibfk_1
  1. 然后將UNIQUE KEY放在列work_id上。
alter table requests drop index work_id
  1. 再次在列work_id上添加Foreign Key
alter table requests add CONSTRAINT `requests_ibfk_1` FOREIGN KEY (`work_id`) REFERENCES `work` (`work_id`)

演示

問題是唯一約束的定義刪除了通常為外鍵創建的索引。 但是還有另一種方法,無需重新創建外鍵約束或(暫時)禁用檢查(這可能導致一致性錯誤)。

首先,為同一列添加另一個索引(出於邏輯原因,我將其完全命名為外鍵):

CREATE INDEX requests_ibfk_1 ON requests(work_id);

現在您可以安全地刪除唯一約束/索引(因為仍然有一個索引可用於外鍵約束):

DROP INDEX work_id ON requests;

我希望這能解決問題。

正如@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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM