source

MySQL 오류 1215: 외부 키 제약 조건을 추가할 수 없습니다.

lovecheck 2023. 1. 15. 17:01
반응형

MySQL 오류 1215: 외부 키 제약 조건을 추가할 수 없습니다.

새로운 스키마를 데이터베이스 서버로 전송하려고 하는데 왜 이 오류가 발생하는지 알 수 없습니다.

여기에서 답을 검색하려고 했지만, 찾은 모든 것은 데이터베이스 엔진을 InnoDB로 설정하거나 외부 키로 사용하려는 키가 테이블 내의 기본 키인지 확인하도록 되어 있습니다.내가 틀리지 않았다면, 나는 이 두 가지 일을 모두 해냈다.내가 또 뭘 할 수 있을까?

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SQL 스크립트 실행 완료: 문: 7개 성공, 1개 실패

부모 테이블의 SQL을 다음에 나타냅니다.

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB

런런 i i i i i i i i i i i?Clients.Case_Number "/"/"Staff.Emp_ID와 완전히 같은 데이터 타입은 아닙니다.Clients_has_Staff.Clients_Case_Number ★★★★★★★★★★★★★★★★★」Clients_has_Staff.Staff_Emp_ID.

부모 테이블의 열은 다음과 같습니다.INT UNSIGNED

두 테이블 모두 정확히 동일한 데이터 유형이어야 합니다.

외부 키 제약 오류 발생 이유:

  1. 모든 테이블에서 InnoDB를 엔진으로 사용하는 것은 아닙니다.
  2. 대상 테이블에 존재하지 않는 키를 참조하려고 합니다.다른 테이블에 있는 키인지 확인합니다(프라이머리 키 또는 일의 키일 수도 있고 단순히 키일 수도 있습니다).key)
  3. 열의 유형이 동일하지 않습니다(단, 참조 테이블의 열은 참조 테이블에서 null이 아니더라도 null일 수 있습니다).
  4. 프라이머리 키 또는 외부 키가 varchar일 경우 조합이 양쪽에서 동일한지 확인합니다.
  5. 중 는 에 .ON DELETE SET NULL는 늘로 정의되어 있지 않습니다.디폴트 null로 설정하다

이것들 좀 봐.

다른 경우에는 열 유형의 불일치로 인해 동일한 오류가 발생할 수 있습니다.MySQL 외부 키 오류에 대한 자세한 내용은 다음 명령을 사용하여 확인할 수 있습니다.

SHOW ENGINE INNODB STATUS;

인쇄된 메시지 상단에 오류가 있을 수 있습니다.뭐랄까

참조된 테이블에서 참조된 열이 첫 번째 열로 나타나는 인덱스를 찾을 수 없거나 테이블과 참조된 테이블의 열 유형이 제약 조건과 일치하지 않습니다.

에러 1215는 귀찮은 것입니다.폭발 필의 대답은 기본을 포함하고 있다.거기서부터 시작하도록 하겠습니다.그러나 주의해야 할 더 많은 미묘한 사례가 있습니다.

를 들어,하려고 할 Primary KEY를 .ON UPDATE ★★★★★★★★★★★★★★★★★」ON DELETE§:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

등)가 있기 수 .id안 돼요.NULL.

이러한 종류의 제약사항을 추가할 때는 더 많은, 마찬가지로 미묘한 문제가 있을 수 있습니다.그러므로 제약사항 오류를 발견할 때는 제약사항과 그 함의가 현재 상황에서 항상 타당하도록 해야 합니다.오류 1215에 행운을 빌어요!

표의 대조 결과를 확인합니다.를 사용하면 대조 등 테이블에 대한 정보를 확인할 수 있습니다.

두 테이블 모두 동일한 데이터 정렬을 가져야 합니다.

나도 그런 적이 있어.

제, 음, 음, 음, 음, 음, 다, 다, 다, 다, in, in, in, in, in, in, in, in, in, in, in, in, 을 사용해서SET FOREIGN_KEY_CHECKS=0 , , , 「 」SET FOREIGN_KEY_CHECKS=1 후, 때, 「○○」이 . 이블시시시시시시시시시 시시시시시error 1215문제는 삭제한 테이블과 새로고침 중인 테이블의 외부 키를 가진 다른 테이블이 데이터베이스에 있다는 것입니다.에서는 필드 쪽 에 의해, 「」가 됩니다.error 1215해당 필드의 새로운 데이터 유형을 사용하여 다른 테이블을 삭제한 후 다시 로드하여 문제를 해결했습니다.

특히 Jeffrey Way의 Larabel 4 Generators에서 Larabel 4를 사용할 때 "Error 1215: Cannot add foreign key contraint"에서 경험한 함정이 있습니다.

Larabel 4에서는 JeffreyWay의 Generators를 사용하여 마이그레이션 파일을 생성하여 테이블을 하나씩 작성할 수 있습니다. 즉, 각 마이그레이션 파일은 하나의 테이블을 생성합니다.

각 이행파일은 파일명에 타임스탬프가 있는 상태로 생성되어 파일에 순서가 지정된다는 점에 유의해야 합니다. 명령어 시.php artisan migrate.

따라서 파일에 외부 키 제약이 요구되면 Error 1215가 호출됩니다.

이 경우 마이그레이션 파일 생성 순서를 조정해야 합니다.새 파일을 올바른 순서로 생성하고 내용을 복사한 다음 순서가 잘못된 이전 파일을 삭제합니다.

외부 키를 추가하려고 할 때 같은 오류가 발생했습니다.제 경우, 이 문제는 외부 키 테이블의 기본 키가 서명되지 않은 것으로 표시되었기 때문에 발생했습니다.

합니다.SHOW TABLE STATUS WHERE Name = 'tableName'.

를 들어,의 테이블이 「」인 는, 1 「」입니다.MyISAM 다른 하나는 '이렇게'입니다.InnoDB이 문제가 발생할 수 있습니다.

이 명령어는 다음 명령으로 변경할 수 있습니다.

ALTER TABLE myTable ENGINE = InnoDB;

문서로부터.

MySQL(InnoDB)의 경우 링크할 열에 대한 정의를 가져옵니다.

SELECT * FROM information_schema.columns WHERE
TABLE_NAME IN (tb_name','referenced_table_name') AND
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

두 열 정의의 비교 및 확인:

같은 COLUMN_TYPE(길이), 같은 COLUMNION

foreign_key 메커니즘을 비활성화/이네이블로 할 필요가 있을 수 있지만 실제 가동 컨텍스트에서는 다음 사항에 주의하십시오.

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;

같은 , in능 in in in in를 비활성화해야 했습니다.FOREIGN KEY소스 테이블이 존재하지 않았기 때문에 체크합니다.

SET FOREIGN_KEY_CHECKS=0;

VARCHAR에서 이 하기 위해 할 수 .지난 주 MySQL Workbench 8.0에서 이 문제를 해결하기 위해 노력했고 마침내 오류를 해결할 수 있었습니다.

단답:스키마, 테이블, 열, 참조 테이블, 참조 열 및 상위 테이블을 참조하는 기타 테이블의 문자 집합과 조합이 일치해야 합니다.

장황한 답변:테이블에 ENUM 데이터형이 있습니다.이거로 바꿨어요VARCHAR또한 참조 테이블에서 값을 가져올 수 있으므로 부모 테이블을 변경하여 옵션을 추가할 필요가 없습니다.이 외부 키 관계는 간단해 보였지만 나는 1215 오류를 얻었다. arvind의 답변과 다음 링크는 사용법을 제안했다.

SHOW ENGINE INNODB STATUS;

이 명령어를 사용하여 오류에 대한 자세한 설명을 얻을 수 있었습니다.추가적인 도움이 되는 정보는 없습니다.

참조된 테이블에서 참조된 열이 첫 번째 열로 나타나는 인덱스를 찾을 수 없거나 테이블과 참조된 테이블의 열 유형이 제약 조건과 일치하지 않습니다.>= InnoDB-4.1.12로 작성된 테이블에서 ENUM 및 SET의 내부 스토리지 타입이 변경되었으며, 이전 테이블의 컬럼은 새 테이블의 컬럼에서 참조할 수 없습니다.올바른 외부 키의 정의에 대해서는, http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html 를 참조해 주세요.

그 후 나는 사용했다.SET FOREIGN_KEY_CHECKS=0;Arvind Bharadwaj의 제안과 여기 링크:

이것에 의해, 다음의 에러 메세지가 표시됩니다.

에러 코드: 1822.외부 키 제약 조건을 추가하지 못했습니다.구속조건에 대한 인덱스가 누락되었습니다.

이 시점에서 스키마를 '리버스 엔지니어'로 편집하여 EER 다이어그램에서 외래 키 관계를 만들 수 있었습니다.'forward engineer' 입력에서 다음 오류가 발생했습니다.

오류 1452: 하위 행을 추가하거나 업데이트할 수 없음: 외부 키 제약 조건이 실패합니다.

EER 다이어그램을 새로운 스키마에 '전송'했을 때 SQL 스크립트는 문제없이 실행되었습니다.생성된 SQL을 forward engineer 시도에서 비교한 결과 문자 집합과 대조라는 차이가 있었습니다. 및 2개의 에는 "", "", "자녀테이블", "자녀테이블"이 있습니다.utf8mb4 및 " " " "utf8mb4_0900_ai_ci했습니다.CHARACTER SET = utf8 , COLLATE = utf8_bin ;하다

스키마 전체에 대해 모든 테이블과 모든 열에 대한 문자 집합과 조회를 다음과 같이 변경했습니다.

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

이것으로 1215 에러로 문제가 해결되었습니다.

사이드 노트:대조utf8mb4_general_ciMySQL Workbench 5.0을 사용합니다. ★★utf8mb4_0900_ai_ci는 MySQL Workbench 8.0 이상에서만 작동합니다.캐릭터 세트와 조합에 문제가 있었던 이유 중 하나는 중간에 MySQL Workbench를 8.0으로 업그레이드했기 때문이라고 생각합니다.이 조합에 대해 자세히 설명하는 링크는 다음과 같습니다.

저도 같은 문제가 있었어요.

이렇게 해결했습니다.

''에을 만들었습니다.primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

스키마 빌더에서 테이블을 가져오려다 이 솔루션을 알게 되었습니다.

저도 같은 문제가 있었습니다.해결책은 다음과 같습니다.

이전:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

솔루션:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

열 유형이 동일하지 않은 경우에도 이 문제가 발생합니다.

예를 들어, 참조하는 열이 UNSIGNED INT이고 참조하는 열이 INT이면 이 오류가 발생합니다.

이 오류를 찾을 수 없습니다.

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

저는 칼럼 타입이었습니다.BigINT!= INT.

하지만 여전히 효과가 없었다.

그래서 엔진을 점검했습니다.표 1 = InnoDB 및 표 = InnoDB 확인

다른 이유: '보다 낫다'를 사용하는 :ON DELETE SET NULL 외부 키에 사용되는 모든 열은 null 값을 허용해야 합니다.질문에서 다른 사람이 발견했어요.

제가 알기론 데이터 무결성에 대해서는 문제가 없지만 MySQL은 이 기능을 지원하지 않는 것 같습니다(5.7).

그래서 나는 위의 모든 수정을 시도했지만 성공하지 못했다.테이블에서 오류를 찾을 수 없습니다.원인을 찾을 수 없어서 오류 1215가 계속 표시됩니다.그래서 이걸 썼어요.

phpMyAdmin 로컬 환경에서 해당 테이블에서 데이터를 내보냈습니다.CSV 포맷을 선택했습니다.테이블이 선택된 상태에서 phpMyAdmin에서 "More-> Options"를 선택했습니다.여기서 "Copy table to (database.table)"로 스크롤을 내렸습니다."구조만"을 선택합니다.표 이름을 바꾸거나 현재 표 이름 옆에 "복사" 단어를 추가합니다."Go"를 클릭합니다. 그러면 새 테이블이 생성됩니다.새 테이블을 내보내고 새 서버 또는 다른 서버로 가져옵니다.여기서도 phpMyAdmin을 사용하고 있습니다.가져온 테이블 이름을 원래 이름으로 다시 변경합니다.새 테이블을 선택하고 가져오기를 선택합니다.포맷으로 CSV를 선택합니다."외부 키 검사 사용"을 선택 취소합니다."Go"를 선택합니다.지금까지는 모든 것이 잘 되고 있다.

나는 내 블로그에 내 수정안을 올렸다.

Larabel 마이그레이션을 사용할 때 외부 키를 만들려는 경우 다음과 같이 하십시오.

사용자 테이블

public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

색상표

public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

속성이 작동하지 않을 수 있습니다.

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

이 에러는, [user table]의 외부 키(타입)가 [colors table]의 프라이머리 키(타입)와 다르기 때문에 발생했습니다.

이 문제를 해결하려면 [colors table]의 프라이머리 키를 변경해야 합니다.

$table->tinyIncrements('id');


키를 , 「 」$table->Increments('id'); 「 」를 합니다.Integer「 」:

$table->unsignedInteger('fk_id');
$table->foreign('fk_id')->references('id')->on('table_name');

키를 $table->tinyIncrements('id');도 이렇게 써야 요.unsignedTinyInteger「 」:

$table->unsignedTinyInteger('fk_id');
$table->foreign('fk_id')->references('id')->on('table_name');

키를 $table->smallIncrements('id');도 이렇게 써야 요.unsignedSmallInteger「 」:

$table->unsignedSmallInteger('fk_id');
$table->foreign('fk_id')->references('id')->on('table_name');

키를 $table->mediumIncrements('id');도 이렇게 써야 요.unsignedMediumInteger「 」:

$table->unsignedMediumInteger('fk_id');
$table->foreign('fk_id')->references('id')->on('table_name');

참조된 테이블이 MyISAM 엔진을 사용하기 때문에 이 오류가 발생하면 이 답변은 데이터베이스를 빠르게 변환하여 모든 Django 모델테이블이 InnoDB를 사용하도록 합니다: 기존 MyISAM 데이터베이스를 Django를 사용하여 InnoDB로 변환합니다.

convert_to_innodb라는 장고 관리 명령어입니다.

우오, 방금 찾았어!이미 게시된 답변이 많이 섞여 있었습니다(InnoDB, 서명되지 않은 답변 등).

여기서 볼 수 없었던 것은 외부 키가 프라이머리 키를 가리키고 있는 경우 소스 열에 적절한 값이 있는지 확인하는 것입니다.예를 들어 기본 키가 mediumint(8)인 경우 소스 열에 mediumint(8)도 포함되어 있는지 확인하십시오.그것은 나에게 문제의 일부였다.

나는 전혀 다른 이유로 이 오류를 경험했다.MySQL Workbench 6.3을 사용하여 데이터 모델(대단한 도구)을 만들었습니다.외부 키 제약 조건 정의에서 정의된 열 순서가 테이블 열 시퀀스에 맞지 않을 때도 이 오류가 발생한다는 것을 알게 되었습니다.

그것을 확인하는 것 외에는 다른 모든 것을 시도하는데 약 4시간이 걸렸습니다.

이것으로, 모두 정상적으로 동작해, 코딩으로 돌아갈 수 있습니다. :-)

이것은 이미 말한 것의 미묘한 버전입니다만, 제 경우는 2개의 데이터베이스(foo와 bar)가 있었습니다.foo를 처음 작성했는데 bar.baz(아직 작성되지 않은)의 외부 키를 참조하고 있는지 몰랐습니다.bar.baz(외부 키 없음)를 작성하려고 했을 때 이 오류가 계속 발생하였습니다.한참을 둘러본 후에 나는 foo에서 외국 열쇠를 발견했다.

요약하자면, 이 오류가 발생할 경우 테이블에 대한 기존 외부 키가 생성되어 있을 수 있습니다.

필드가 동일하게 정의되어 있는지, 테이블타입도 동일한 조합이 있는지 확인하기 위한 위의 모든 조언과 함께 자녀 필드의 데이터가 부모 필드에 아직 없는 필드를 링크하려고 하는 새로운 실수가 없도록 하십시오.부모 필드에 아직 입력하지 않은 하위 필드에 있는 데이터가 있는 경우 이 오류가 발생합니다.에러 메세지가 조금이나마 도움이 되지 않는 것이 유감입니다.

확실하지 않은 경우 외부 키가 있는 테이블을 백업하고 모든 데이터를 삭제한 후 외부 키를 생성해 보십시오.성공하면 무엇을 해야 할지 알 수 있습니다!

백틱의 사용에도 주의해 주세요.나는 대본에서 다음과 같은 진술을 했다.

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

마지막 뒷부분은 거짓이었어요다음과 같이 해야 합니다.

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

안타깝게도 MySQL은 이 오류에 대한 자세한 내용을 제공하지 않습니다.

이 에러의 또 다른 원인은, 같은 외부 키명을 가지는 같은 테이블명이 2개 이상 있는 경우입니다.

MySQL Workbench와 같은 모델링 및 설계 소프트웨어를 사용하고 나중에 설계에서 스크립트를 생성하는 사람들에게 이러한 현상이 종종 발생합니다.

「Import」에 의해서 하고 했습니다.mysqldump테이블은 알파벳 순으로 작성됩니다.이 경우 외부 키는 파일 뒷부분에서 작성된 테이블을 참조하게 됩니다.(이 블로그 포스트에 제안하여 지적합니다.MySQL 오류 코드 1215: "외부구속조건을 추가할 수 없습니다")

mysqldump는 테이블을 알파벳 순으로 주문하고 테이블 이름을 바꾸고 싶지 않았기 때문에, 나는 Jeremy의 답변에 있는 지시에 따랐다.이 페이지의 Weir는 이 페이지에set FOREIGN_KEY_CHECKS = 0;에 「」를 붙입니다.SET FOREIGN_KEY_CHECKS = 1;을 사용하다

그 해결책은 나에게 효과가 있었다.

또한 두 테이블의 Engine이 InnoDB로 설정되어 있는지 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/16969060/mysql-error-1215-cannot-add-foreign-key-constraint

반응형