외부 키 열의 mysql 테이블에서 고유한 제약 조건을 삭제하는 방법
저는 그냥 떨어뜨리고 싶어요.UNIQUE Constraint
[ MySQL ]테이블 컬럼을 사용하여Foreign Key Constraint
'있는 그대로'라는 칼럼에. work_id
는 외부 키입니다.처음에는 열이 고유(일대일 관계)해야 했지만 지금은 필요하지 않습니다.MySQL Ver 15.1 Distributed 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
삭제하고 싶다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;
에러가 발생하다
ERROR 1553 (HY000):'work_id' 인덱스를 삭제할 수 없습니다. 외부 키 제약 조건에 필요합니다.
그래서, 당신의 문제는 당신이 에 사용되는 인덱스를 떨어뜨리려고 한다는 것입니다.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
- 다시 추가
Foreign Key
칼럼에work_id
.
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;
언급URL : https://stackoverflow.com/questions/63497147/how-to-drop-unique-constraint-from-mysql-table-on-a-foreign-key-column
'programing' 카테고리의 다른 글
기본 키의 mariadb 최적화가 작동하지 않음 (0) | 2022.10.12 |
---|---|
구현에 Javadoc 코멘트를 추가할 필요가 있습니까? (0) | 2022.10.12 |
Vue에서 구성 요소를 가져올 위치 (0) | 2022.10.12 |
MySQL 데이터베이스 이름 변경 (0) | 2022.10.03 |
경고: mysql_connect(): [2002]에 이러한 파일 또는 디렉토리가 없습니다(unix:///tmp/mysql.sock 경유로 접속하려고 합니다). (0) | 2022.10.03 |