MySQL 테이블에서 제약 조건을 제거하는 방법은 무엇입니까?


252

내 테이블에서 제약 조건을 제거하고 싶습니다. 내 질문은 :

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

그러나 오류가 발생했습니다.

#1064-SQL 구문에 오류가 있습니다. FK_tbl_magazine_issue_mst_users라인 1에서 '제한 ' 근처에서 사용할 올바른 구문은 MySQL 서버 버전에 해당하는 매뉴얼을 확인하십시오.


1
CHECK구속 조건 을 작성한 경우 실제 구속 조건이 작성되지 않기 때문에 구속 조건을 제거 할 필요가 없습니다. 에서 선택 information_schema.table_constraints하여 확인할 수 있으며 add constraint오류없이 반복해서 실행할 수도 있습니다 . MySQL은 CHECK제약 조건을 지원하지 않지만 SQL이 제약 조건을 실제로 만들지 않고 제약 조건을 만들 수 있습니다.
ADTC



귀하의 구문은 완벽하게 유효 지금은 지원됩니다 데모
루카스 Szozda

답변:


423

MySQL에는 외래 키 제약 조건을 삭제하는 특수 구문이 있습니다.

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
Postgres, MSSQL 및 Oracle에는 모두가 있습니다 alter table .. drop constraint. MySQL은 이상한 것 같습니다.
Jared Beck

외래 키 제약 조건에 필요하기 때문에 "column2"를 삭제할 수 없다고 말합니다. 내가 말한대로 "Cant DROP column2; 열 / 키가 있는지 확인하십시오"
Lealo

좋아, 외국어는 열을 다른 테이블 열에 연결하는 별도의 것입니다. 내 표준 이름이 주어졌습니다. 또한 이제 열 자체를 삭제하지 않고도 외래 키를
안전하게

1
Wellington Lorindo의 솔루션은 외래 키를 제거해도 관련 인덱스가 제거되지 않기 때문에보다 정확한 것으로 보일 수 있습니다. 물론 인덱스는 개별적으로 생성되었을 수도 있지만 외래 키를 처음에 추가 한 결과로 생성 된 경우에는 외래 키를 삭제해도 제거되지 않습니다.
Rich Harding

55

나는 같은 문제가 있었고이 코드로 해결해야했다.

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;

2
외래 키를 제거하면 인덱스가 제거되지 않기 때문에 허용 된 솔루션보다 더 정확한 것으로 보일 수 있습니다. 물론 인덱스는 개별적으로 생성되었을 수도 있지만 외래 키를 처음에 추가 한 결과로 생성 된 경우에는 외래 키를 삭제해도 제거되지 않습니다.
Rich Harding

3
단일 명령으로 : ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte

26

DROP CONSTRAINTMySQL 과 같은 것은 없습니다 . 귀하의 경우 DROP FOREIGN KEY대신 사용할 수 있습니다 .


12

제약 조건이 외래 키가 아닌 경우 (예 : 하나는 'UNIQUE CONSTRAINT (colA, colB)'를 사용하여 추가 한 다음을 사용하여 삭제할 수있는 색인입니다ALTER TABLE ... DROP INDEX ...


9

또한 mysql 데이터베이스에서 모든 외래 키 검사를 일시적으로 비활성화 할 수 있습니다 SET FOREIGN_KEY_CHECKS=0; . SET FOREIGN_KEY_CHECKS=1;


8

Robert Knight의 답변에 약간을 추가하려면 게시물 자체의 제목에 외래 키가 언급되어 있지 않으므로 (완료된 코드 샘플이 없으며 SO의 주석 코드 블록이 답변 코드와 함께 표시되지 않기 때문에) 블록), 고유 제약 조건을 위해 이것을 추가합니다 . 이러한 작업 중 하나를 수행하여 제약 조건을 제거하십시오.

ALTER TABLE `table_name` DROP KEY `uc_name`;

또는

ALTER TABLE `table_name` DROP INDEX `uc_name`;

4

일부 ORM 또는 프레임 워크 FK_[parent table]_[referenced table]_[referencing field]는 변경 될 수 있기 때문에 외래 키에 대해 외래 키에 대해 다른 명명 규칙을 사용합니다 .

예를 들어 라 라벨은 [parent table]_[referencing field]_foreign명명 규칙으로 사용합니다 . 와 같이이 쿼리를 사용하여 외부 키의 이름을 표시 할 수 있습니다 여기에 :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

그런 다음 앞에서 언급 한 DROP FOREIGN KEY 쿼리와 해당 이름을 실행하여 외래 키를 제거하십시오.


2

MariaDB를 사용하여 여기에 오는 사람들을 위해 :

MariaDB는 일반적으로 검사 제한 조건 삭제와 같은 DROP CONSTRAINT 문을 허용합니다.

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/


예, 예를 들어 같은 테이블 내에있는 제약 조건을위한 것 CONSTRAINT CHECK(a > b)입니다. 외래 키 제약 조건의 경우 DROP FOREIGN KEY적어도 MariaDB 버전 10.2
Frank Forte

1
  1. 테이블의 구조보기로 이동
  2. 상단에 2 개의 옵션이 표시됩니다 a. 테이블 구조 b. 관계보기 .
  3. 이제 관계보기 를 클릭하면 외래 키 제약 조건을 삭제할 수 있습니다. 당신은 여기에서 모든 관계를 얻을 것입니다.

즉,이 ID를 모를 때 나를 위해 일한, 좋아요
실비 세인트

0

DROP CONSTRAINTIn MySql 이 없습니다 . 이것은 mysql 5.7에서 마술처럼 작동합니다.

ALTER TABLE answer DROP KEY const_name;

0

제약 조건을 제거하는 가장 간단한 방법 ALTER TABLE tbl_name DROP CONSTRAINT symbol;MySQL 8.0.19에 도입 된 구문을 사용하는 것입니다 .

MySQL 8.0.19부터 ALTER TABLE은 제약 유형이 제약 이름에서 결정되는 모든 유형의 기존 제약 조건을 삭제하고 변경하기 위해보다 일반적인 (및 SQL 표준) 구문을 허용합니다

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> 바이올린 데모


-4

이것은 제약 조건을 삭제하기 위해 MySQL에서 작동합니다.

alter table tablename drop primary key;

alter table tablename drop foreign key;

DROP PRIMARY KEY작동하지 않아야합니다. DROP FOREIGN KEY작동하지만 대상을 지정해야합니다 drop. 예를 들어ALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.