본문 바로가기
LEARN/ERROR

[ERROR] MySQL cannot drop column 'age': needed in a foreign key constraint 'fbgws5tlq1ib1io6mqalmjnur8a'

by 아이엠제니 2024. 4. 25.

 


 

 

 

alter table student drop column age;

테이블에서 속성(컬럼)을 삭제해야 했다.

 

 

 

cannot drop column 'age': needed in a foreign key constraint 'fbgws5tlq1ib1io6mqalmjnur8a'

해당 열이 다른 테이블과 연결되어 있는 참조 관계여서 삭제가 되질 않았다.

 

 

 

-- 참조키 해제
SET foreign_key_checks = 0;
-- 여기서 업데이트 수행
-- 참조키 설정
SET foreign_key_checks = 1;

위 쿼리를 사용하면 참조 관계인 컬럼도 삭제가 될 줄 알았으나, 되질 않았다.

 

 

일단 해당 오류는 외래키 제약 조건이 해당 열에 의존하고 있어서, 열을 삭제할 수 없을 때 나타난다고 한다.

외래키 제약 조건은 데이터의 무결성을 보장하기 위해 참조 무결성을 유지하는 역할을 하기 때문이라고 한다.

그렇기 때문에 외래키 제약 조건이 있는 열을 삭제하려고 시도하면, 데이터베이스가 이를 거부하고 해당 오류 메시지를 반환한다.

 

 

보통은 테이블을 MySQL에서 생성을 해도, DBeaver를 통해 MySQL을 사용한다.

하지만 가끔 디비버가 먹통일 때도 있고, 쿼리가 안 먹을 때가 있다.

심지어 테이블 업데이트도 실시간으로 안 될 때가 있다.

그럴 때는 DBeaver를 종료했다가, 다시 시작하면 되는 경우도 있다.

하지만 이번의 경우에는 디비버에서 쿼리 자체가 먹질 않아, MySQL 워크벤치를 열고 시도했는데!

MySQL 워크벤치에서는 너무 잘 되는 것이었다.

그러니 혹시라도 나처럼 디비버에서 하다가 안 되는 경우라면, MySQL 워크벤치를 열어서 쿼리를 날려보기를 추천한다.

 

 

cannot drop column 'age': needed in a foreign key constraint 'fbgws5tlq1ib1io6mqalmjnur8a'

우선 이런 에러가 나온다면, 'fbgws5tlq1ib1io6mqalmjnur8a' 이 부분을 참고하여 외래키 제약 조건을 삭제하고, 삭제하려는 컬럼을 삭제하면 된다.

 

 

 

1. 외래키 제약 조건 삭제


ALTER TABLE 테이블명 DROP FOREGIN KEY 외래키제약조건
ALTER TABLE student DROP FOREGIN KEY fbgws5tlq1ib1io6mqalmjnur8a

 

위와 같이 외래키 제약 조건을 삭제한다.

 

 

 

2. 열 삭제


ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
ALTER TABLE student DROP COLUMN age;

위 명령어를 이용해 다시 열 삭제를 시도해보면?

된다.

 

 

 

3. 외래키 제약 조건 확인


SHOW CREATE TABLE TABLE_NAME;
SHOW CREATE TABLE STUDENT;

만약 외래키 제약 조건을 확인하고 싶다면, 위 쿼리를 사용하면 된다.

 

 

'student', 'CREATE TABLE `student` (\n `id` bigint NOT NULL AUTO_INCREMENT,\n `created` datetime(6) NOT NULL COMMENT \'생성일\',\n `creator` varchar(40) NOT NULL COMMENT \'생성자\',\n `modified` datetime(6) NOT NULL COMMENT \'수정일\',\n `modifier` varchar(40) NOT NULL COMMENT \'수정자\',\n `name` bigint NOT NULL,\n `age` bigint NOT NULL,\n `address` bigint NOT NULL,\n PRIMARY KEY (`id`),\n KEY `fk` (`컬럼명`),\n KEY `fk` (`컬럼명`),\n KEY `fk` (`컬럼명`),\n CONSTRAINT `fk` FOREIGN KEY (`컬럼명`) REFERENCES `fk테이블` (`컬럼명`),\n CONSTRAINT `fk` FOREIGN KEY (`컬럼명`) REFERENCES `fk테이블` (`컬럼명`),\n CONSTRAINT `fbgws5tlq1ib1io6mqalmjnur8a` FOREIGN KEY (`age`) REFERENCES `student_age` (`age`)\n) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 

위 쿼리를 날리면, 위와 같은 내용을 확인할 수 있는데!

여기서 내가 삭제하려는 컬럼의 제약조건을 확인할 수 있다.

그럼 1번의 쿼리를 사용해 외래키 제약 조건을 삭제하고, 2번의 쿼리로 컬럼을 삭제하면 된다.

 

 

 

300x250