MySQL 일부 외래 키 제거


190

기본 키가 다른 여러 테이블에서 사용되고 다른 테이블에 대한 외래 키가 여러 개인 테이블이 있습니다.

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

문제는 외래 키 열 중 하나 (예 : locationIDX)를 삭제하려고 할 때 오류가 발생한다는 것입니다.

"오류 1025 (HY000) : 이름 바꾸기 오류"

이 오류가 발생하지 않고 위의 할당 테이블에서 열을 삭제하려면 어떻게해야합니까?

답변:


447

여기 에 설명 된 것처럼 외래 키 제약 조건은 인덱스 이름이 아닌 제약 조건 이름 으로 삭제해야합니다 . 구문은 다음과 같습니다.

alter table footable drop foreign key fooconstraint

35
이것은 내 문제였다. 나는 지금 바보 같은 느낌입니다. 다른 사람이이 문제를 겪고 있다면 SHOW CREATE TABLE 함수를 사용하여 외래 키 제약 조건 이름을 찾을 수 있습니다.
Drew

14
팁 : SHOW CREATE TABLE footable;구속 조건의 이름이 무엇인지 확인하십시오. 열 자체의 이름이 아닙니다. 답변 해주셔서 감사합니다!
Chris Baker

2
당신은 외래 키 제약 조건을 찾기 위해 이것을 사용할 수 있습니다 : information_schema.table_constraints SELECT * FROM WHERE constraint_schema = '<당신의 DB 이름>'AND CONSTRAINT_TYPE = 'FOREIGN KEY'
Gayan Dasanayake

21

외래 키는 데이터 무결성을 보장하기 위해 존재하므로 외래 키의 일부인 한 열을 삭제할 수 없습니다. 먼저 키를 떨어 뜨려야합니다.

다음 쿼리가 그렇게 할 것이라고 생각합니다.

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

위에서 언급했듯이 FK를 쉽게 삭제할 수 있습니다. 그러나 방금 KEY 자체를 삭제해야 할 수도 있습니다. 마지막 색인과 같은 다른 색인을 작성하는 오류 메시지가있는 경우 동일한 이름을 사용하면 해당 색인과 관련된 모든 항목을 삭제하는 것이 좋습니다.

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above

10

CONSTRAINT 이름과 FOREIGN KEY 이름이 무엇인지 확인하십시오.

SHOW CREATE TABLE table_name;

CONSTRAINT 이름과 FOREIGN KEY 이름을 모두 제거하십시오.

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

도움이 되었기를 바랍니다!


4

외래 키 제약 조건을 삭제하는 방법이 있습니다. 테이블 변경 location. location_id 드롭 외래 키 location_ibfk_1;


2

이봐, 나는 위의 순서를 따라 해결책을 찾았다.

SHOW CREATE TABLE footable;

당신은 FK 제약 이름을 얻을 것입니다

ProjectsInfo_ibfk_1

이제이 제약 조건을 제거해야합니다. alter table commantd에 의해

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

그런 다음 테이블 열을 삭제하십시오.

alter table ProjectsInfo drop column clientId;

1

테이블에서 InnoDB 엔진을 사용하는 경우 일반적으로이 오류가 발생합니다. 이 경우 외래 키를 삭제 한 다음 alter 테이블을 수행하고 열을 삭제해야합니다.

그러나 까다로운 부분은 열 이름을 사용하여 외래 키를 삭제할 수 없지만 대신 색인을 생성하는 데 사용되는 이름을 찾아야한다는 것입니다. 이를 찾으려면 다음을 선택하십시오.

테이블 생성 영역 표시; 왼쪽 상단 모서리에서 + 옵션을 클릭하고 전체 텍스트 raio 버튼을 클릭 한 다음 이동을 클릭하면 행이 표시됩니다. 색인의 이름이 다음과 같이 나타납니다.

CONSTRAINT region_ibfk_1 FOREIGN KEY (country_id) 참조 국가 (id) ON 업데이트에 대한 조치 없음 삭제 조치 없음 이제 간단히 다음을 발행하십시오.

테이블 영역 삭제 외래 키 region_ibfk_1 변경;

또는

더 간단하게 입력 :-alter table TableName drop foreign key TableName_ibfk_1 ;

테이블 이름 뒤에 _ibfk_1 을 추가 하여 다음과 같이 만드는 것이 유일 합니다 .- TableName _ibfk_1


0

외래 키 열이 테이블에서 참조되고 있으므로 삭제할 수 없습니다 assignmentStuff. 따라서 먼저 외래 키 제약 조건을 삭제해야합니다assignmentStuff.assignmentIDX .

비슷한 질문이 이미 여기 에 요청 되었습니다 . 자세한 내용 은 여기 를 확인 하십시오 .


1
따라서 assignmentStuff가 과제의 기본 키를 참조하기 때문에 과제의 locationID 열을 삭제할 수 없습니까? 이것은 일종의 직관적 인 것 같습니다.
Drew

열 이름을 바꿔서 내 대답이 실제로 이해되지 않는 것 같습니다. 죄송합니다 ...
Ronald Wildenberg


0

1 단계: show create table vendor_locations;

2 단계: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

그것은 나를 위해 일했다.


0

먼저이 쿼리로 실제 제한 이름을 가져와야합니다.

SHOW CREATE TABLE TABLE_NAME

이 쿼리는 외래 키의 이름을 제한합니다. 이제 쿼리 아래에서 삭제합니다.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

위의 제약 조건 이름의 마지막 숫자는 테이블에있는 외래 키 수에 따라 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.