programing

외부 키 제약 조건에 사용된 열을 변경할 수 없습니다.

randomtip 2022. 10. 2. 11:16
반응형

외부 키 제약 조건에 사용된 열을 변경할 수 없습니다.

테이블을 바꾸려고 할 때 이 오류가 발생했습니다.

Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'

이것이 정상적으로 실행된 나의 CREATE TABLE 문입니다.

CREATE TABLE favorite_food(
    person_id SMALLINT UNSIGNED,
    food VARCHAR(20),
    CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
    CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
    REFERENCES person (person_id)
);

그리고 이 문장을 실행하려고 했는데 위의 오류가 발생했습니다.

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

외부 키 검사를 끌 수 있습니다.

SET FOREIGN_KEY_CHECKS = 0;

/* DO WHAT YOU NEED HERE */

SET FOREIGN_KEY_CHECKS = 1;

프로덕션에서 사용하지 말고 백업해 주세요.

외부 키 필드 및 참조의 유형과 정의는 동일해야 합니다.즉, 외부 키를 사용하여 필드 유형을 변경할 수 없습니다.

한 가지 해결책은 다음과 같습니다.

LOCK TABLES 
    favorite_food WRITE,
    person WRITE;

ALTER TABLE favorite_food
    DROP FOREIGN KEY fk_fav_food_person_id,
    MODIFY person_id SMALLINT UNSIGNED;

이제 person_id를 변경할 수 있습니다.

ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;

외부 키 재생성

ALTER TABLE favorite_food
    ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
          REFERENCES person (person_id);

UNLOCK TABLES;

편집: 코멘트 덕분에 위에 잠금 추가

이 작업을 수행하는 동안 데이터베이스에 쓰기를 허용하지 않아야 합니다. 그렇지 않으면 데이터 무결성 문제가 발생할 수 있습니다.

위에 쓰기 잠금을 추가했습니다.

자신의 세션 이외의 세션에서 모두 쿼리를 작성합니다(INSERT, UPDATE, DELETE)는 타임아웃이 될 때까지 기다립니다.UNLOCK TABLES;가 실행됩니다.

http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html

EDIT 2: OP에서 "외부 키 필드와 참조의 유형과 정의는 같아야 합니다.즉, 외부 키를 사용하여 필드 유형을 변경할 수 없습니다."

MySQL 5.5 레퍼런스 매뉴얼: FORENAL KEY 제약사항

외부키와 참조키에 해당하는 열은 InnoDB 내에 유사한 내부 데이터형이 있어야 유형 변환 없이 비교할 수 있습니다.정수 형식의 크기와 부호는 같아야 합니다.문자열 유형의 길이는 같을 필요가 없습니다.이진 문자열 열의 경우 문자 집합과 조합이 동일해야 합니다.

제 경우, 추가가 필요했습니다.GLOBAL.

SET FOREIGN_KEY_CHECKS = 0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;

/* DO WHAT YOU NEED HERE */

SET FOREIGN_KEY_CHECKS = 1;
SET GLOBAL FOREIGN_KEY_CHECKS=1;

해당 테이블의 구조 탭으로 이동합니다.작업 아래에 색인이 있습니다.떨어뜨려라

필요한 수정이 완료되면 외부 키를 가져와 삭제된 인덱스를 복원합니다.그런 다음 구조가 동일하고 변경되지 않았는지 확인하십시오.

키(프라이머리 또는 외부 키)를 설정할 때 키 사용 방법에 대한 제약이 설정되므로 키로 수행할 수 있는 작업이 제한됩니다.정말로 열을 변경하고 싶다면 제약 없이 테이블을 다시 만들 수 있습니다. 단, 반대할 것을 권장합니다.일반적으로 무엇을 하고 싶은데, 그것이 제약에 의해 막혀 있다면, 그것은 제약보다는 자신이 하고 싶은 것을 바꾸는 것이 가장 잘 해결된다.

언급URL : https://stackoverflow.com/questions/13606469/cannot-change-column-used-in-a-foreign-key-constraint

반응형