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


336

새 스키마를 DB 서버에 전달하려고하는데 왜이 오류가 발생하는지 알 수 없습니다. 여기에서 답을 찾으려고 노력했지만 찾은 모든 것은 db 엔진을 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

6
부모 테이블에 대한 스키마를 게시하십시오 : ClientsStaff.
Ike Walker


1
@Denis는 OP가 열이 부모 테이블의 PK임을 확인했기 때문에 중복되지 않을 것입니다.
Ike Walker

요청에 따라 클라이언트 및 직원 테이블에 대한 SQL 문을 추가했습니다.
Robert B

답변:


592

나는 그 추측하고있어 Clients.Case_Number및 / 또는 Staff.Emp_ID정확히 같은 데이터 형식되지 않습니다 Clients_has_Staff.Clients_Case_NumberClients_has_Staff.Staff_Emp_ID .

아마도 부모 테이블의 열은 INT UNSIGNED ?

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


10
감사. 이것은 문제로 판명되었습니다. Staff.Emp_ID는 SMALLINT이고 참조 열은 INT입니다. 때로는 작은 일들입니다.
Robert B

Tks. 필자의 경우 실수로 자식 테이블의 외래 키에서 "ZeroFill"을 클릭하여 부모 테이블의 열과 정확히 일치하지 않습니다.
wwkudu

12
문자 집합이 다를 수도 있습니다. 한 열에는 utf8 문자 세트가 있고 다른 열에는 latin1이있는이 문제가있었습니다. ALTER TABLE TableCHARACTER SET = utf8; ALTER TABLE DeviceCHANGE COLUMN ID IDCHAR (36) 문자 세트 'utf8'NOT NULL;
www.jensolsson.se

3
@ 약동학 하나 이상의 문자열 열이 포함되어있는 경우가 올바른지 www.jensolsson.se 다음은 동일한 문자 집합을 사용해야합니다 정렬을. 이 특정 경우 PK는 INT이므로 테이블 및 / 또는 열의 문자 세트는 관련이 없습니다.
Ike Walker

2
데이터 정렬은 latin1 대 utf8입니다 (테이블과 열을 확인하십시오).
ben_979

244

외래 키 제약 조건 오류가 발생할 수있는 이유 :

  1. 모든 테이블에서 InnoDB를 엔진으로 사용하지는 않습니다.
  2. 대상 테이블에서 존재하지 않는 키를 참조하려고합니다. 그것이 열쇠 인지 확인하십시오다른 테이블 (기본 또는 고유 키일 수 있음)
  3. 컬럼 유형이 동일하지 않습니다 (예외 테이블의 컬럼은 널 입력 가능).
  4. PK / FK가 varchar 인 경우 데이터 정렬이 둘 다 동일해야합니다.

최신 정보:

  1. 사용중인 열이 ON DELETE SET NULL널로 정의되지 않았기 때문일 수도 있습니다 . 따라서 열이 기본 널로 설정되어 있는지 확인하십시오.

이것들을 확인하십시오.


14
FK가 문자 열에 있으면 문자 집합과 데이터 정렬이 같아야한다고 생각합니다. (또는 1 바이트 및 2 바이트 문자 집합이 호환되지 않을 수 있습니다.)
Graham Charles

5
내 이유는 처음으로 "InnoDB와 MyISAM의 두 테이블을위한 다른 DB 엔진"을 지적한 것이
었습니다.

7
또 다른 이유가 있습니다 =)```ON DELETE CASCADE ON UPDATE SET NULL :```일부 열이 NOT NULL로 정의되어 있지만 SET NULL 조건을 정의했습니다. 그래서 FK 정의를 수정했습니다.
alexglue

1
또한 가능한 실패는 대상 필드 에 색인없는 것입니다 .
Paul T. Rawkeen

1
네번째 요점은 내 문제였다. 불쾌한 일이지만 mysql이 그 문제로 인해 매우 기뻤습니다
Sebas

85

다른 유형의 경우 열 유형이 일치하지 않아 동일한 오류가 발생하지 않을 수 있습니다. 명령을 실행하여 mysql foriegn 키 오류에 대한 자세한 정보를 찾을 수 있습니다

SHOW ENGINE INNODB STATUS;

인쇄 된 메시지 상단 근처에 오류가있을 수 있습니다.

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


13
이것이 내가 진단에 도움이된다고 생각하는 가장 좋은 대답입니다! 감사.
alexglue

어떻게 작동해야합니까? 두 쿼리를 연속으로 실행 하시겠습니까?
C4d

@ C4u, 예, ENGINE INNODB STATUS를 먼저 표시 한 다음 다른 쿼리를 수행하여 두 쿼리를 연속으로 실행해야합니다
sureshd

PHPMyAdmin에서 수행하면 작동하지 않습니다. 명령 프롬프트에서 수행하십시오.
ruwan800

13

오류 1215는 성가신 것입니다. 폭발 필의 답변 은 기본 사항을 다룹니다. 거기서부터 시작하고 싶습니다. 그러나 더 많은 미묘한 사례가 있습니다.

당신이 다른 테이블의 기본 키를 연결하려고 할 때 예를 들어, 적절한 제공 할 수 있는지 확인 ON UPDATE하고 ON DELETE옵션을. 예 :

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

PRIMARY KEY (예 :)를 id사용할 수 없으므로 비행 하지 않습니다 NULL.

이러한 종류의 제약 조건을 추가 할 때 훨씬 더 유사하게 미묘한 문제가 있다고 확신하므로 제약 조건 오류가 발생할 때 제약 조건과 그 의미가 현재 상황에서 항상 의미가 있는지 확인하십시오. 오류 1215와 함께 행운을 빕니다!


1
존재하지 않는 외래 키를 삭제하려고하면이 오류가 발생합니다. :)
Explosion Pills

2
또한 문서에서 : MySQL에는 외래 키 및 참조 키에 대한 인덱스가 필요하므로 외래 키 검사가 빠르며 테이블 스캔이 필요하지 않습니다. 참조 테이블에는 외래 키 열이 동일한 순서로 첫 번째 열로 나열되는 인덱스가 있어야합니다 . 이러한 인덱스는 참조 테이블에 존재하지 않으면 자동으로 작성됩니다. 외래 키 제약 조건을 적용하는 데 사용할 수있는 다른 인덱스를 만들면이 인덱스가 나중에 자동으로 삭제 될 수 있습니다. 주어진 경우 index_name이 앞에서 설명한대로 사용됩니다.
Jonathan M

1
그것이 내가 여기에 온 이유 입니다. ON DELETE SET NULL나는 원하는 열에 외래 키를 만들려고했습니다 NOT NULL. 케이크를 가지고 먹을 수 없다고 가정하십시오.
Martin Hennings

8

데이터 정렬을 SHOW TABLE STATUS포함하여 테이블에 대한 정보 를 확인할 수 있습니다.

두 테이블의 데이터 정렬이 동일해야합니다.

나 한테 일어난 일이야


이것은 내 경우의 문제였습니다-MySQL 오류는 전혀 도움이되지 않습니다!
Juddling

7

내 경우에는을 사용하여 테이블을 삭제 한 SET FOREIGN_KEY_CHECKS=0다음 SET FOREIGN_KEY_CHECKS=1후에 테이블을 다시로드하려고 할 때 error 1215. 문제는 데이터베이스에 삭제 한 테이블에 외래 키가 있고 다시로드하는 다른 테이블이 있다는 것입니다. 재로드 프로세스의 일부에는 필드 중 하나에 대한 데이터 유형 변경이 포함되어 다른 테이블의 외래 키가 유효하지 않게되어 트리거 error 1215됩니다. 관련 필드의 새 데이터 형식으로 다른 테이블을 삭제 한 다음 다시로드하여 문제를 해결했습니다.


5

fk를 추가하는 동안 동일한 오류가 발생했습니다. 필자의 경우 문제는 서명되지 않은 것으로 표시된 FK 테이블의 PK로 인해 발생했습니다.


5

Laravel 4를 사용할 때, 특히 JeffreyWay의 Laravel 4 Generators에서 "오류 1215 : 외래 키 제약 조건을 추가 할 수 없습니다"에서 경험 한 함정이 있습니다.

Laravel 4에서는 JeffreyWay의 생성기를 사용하여 마이그레이션 파일을 생성하여 테이블을 하나씩 생성 할 수 있습니다. 즉, 각 마이그레이션 파일은 하나의 테이블을 생성합니다. 각 마이그레이션 파일이 파일 이름에 타임 스탬프와 함께 생성되어 파일에 순서를 부여한다는 사실을 알고 있어야합니다. 생성 순서는 Artisan CLI 명령 "php artisan migrate"를 실행할 때의 마이그레이션 작업 순서이기도합니다. 따라서 파일이 후자의 파일에서 아직 생성되지 않는 키를 참조하는 외래 키 제약 조건을 요청하면 오류 1215가 발생합니다. 이 경우 마이그레이션 파일 생성 순서를 조정해야합니다. 올바른 순서로 새 파일을 생성하고 내용을 복사 한 다음 무질서한 오래된 파일을 삭제하십시오.


3

나는 같은 문제가 있었다.

전에:

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)

);

나는 그것이 도움이되기를 바랍니다.)


1
당신은 쉼표 몇 잊었 첫 번째 CREATE
DLight

3

나는 같은 문제가 있었다.
나는 이것을 해결했다.

나는 다음 줄을 만들었습니다.
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

스키마 빌더에서 테이블을 가져 오려고 시도한 후이 솔루션을 찾았습니다. 그것이 당신을 위해 작동하면 알려주세요!

행운을 빕니다!

펠리페 테르시오


3

VARCHAR외래 키 관계 에 대해서도이 사례를 추가하고 싶었습니다 . 지난 주에 MySQL Workbench 8.0에서 이것을 알아 내려고 노력했으며 마침내 오류를 해결할 수있었습니다.

짧은 답변 : 스키마, 테이블, 열, 참조 테이블, 참조 열 및 부모 테이블을 참조하는 다른 테이블의 문자 집합과 데이터 정렬이 일치해야합니다.

긴 답변 : 테이블에 ENUM 데이터 유형이 있습니다. 나는 이것을 변경 VARCHAR했고 참조 테이블에서 값을 얻을 수 있으므로 추가 옵션을 추가하기 위해 부모 테이블을 변경할 필요가 없습니다. 이 외래 관계는 간단 해 보였지만 1215 오류가 발생했습니다. arvind 의 답변과 다음 링크

SHOW ENGINE INNODB STATUS;

이 명령을 사용할 때 도움이되는 추가 정보가없는 오류에 대한 자세한 설명이 있습니다

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

그 후 Arvind Bharadwaj가SET FOREIGN_KEY_CHECKS=0; 제안한대로 사용 하고 여기 에 링크가 있습니다 .

다음과 같은 오류 메시지가 나타납니다.

오류 코드 : 1822. 외래 키 제약 조건을 추가하지 못했습니다. 제약 조건에 대한 누락 된 인덱스

이 시점에서 나는 '역 엔지니어'-스키마를 작성했고 EER 다이어그램에서 외래 키 관계를 만들 수있었습니다. '앞으로 엔지니어'-ing에서 다음과 같은 오류가 발생했습니다.

오류 1452 : 자식 행을 추가하거나 업데이트 할 수 없습니다 : 외래 키 제약 조건이 실패합니다

EER 다이어그램을 새 스키마로 '전진 엔지니어링'할 때 SQL 스크립트가 문제없이 실행되었습니다. 포워드 엔지니어의 시도에서 생성 된 SQL을 비교할 때 차이점은 문자 집합과 데이터 정렬이라는 것을 알았습니다. 부모 테이블, 자식 테이블 및 두 열에는 utf8mb4문자 집합과 utf8mb4_0900_ai_ci데이터 정렬이 있었지만 부모 테이블의 다른 열 CHARACTER SET = utf8 , COLLATE = utf8_bin ;은 다른 자식 테이블을 사용하여 참조되었습니다 .

전체 스키마에 대해 모든 테이블과 모든 열의 문자 집합과 데이터 정렬을 다음과 같이 변경했습니다.

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

이것은 마침내 1215 오류로 내 문제를 해결했습니다.

참고 : 데이터 정렬 utf8mb4_general_ci은 MySQL Workbench 5.0 이상에서 작동합니다. 데이터 정렬 utf8mb4_0900_ai_ci은 MySQL Workbench 8.0 이상에서만 작동합니다. 문자 세트 및 데이터 정렬에 문제가있는 이유 중 하나는 MySQL Workbench가 8.0으로 업그레이드 되었기 때문입니다. 이 데이터 정렬에 대해 더 자세히 설명 하는 링크 가 있습니다.


2

이 오류를 찾을 수 없습니다

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
)

2

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

예를 들어 참조하는 열이 UNSIGNED INT이고 참조되는 열이 INT 인 경우이 오류가 발생합니다.


2

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 (길이), 동일한 COLATION

연주하는 데 도움이 될 수 있습니다

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;

2

테이블 호환성을 확인하십시오. 예를 들어 한 테이블이 MyISAM있고 다른 테이블이 인 InnoDB경우이 문제가 발생할 수 있습니다.


2

다른 이유 : 외래 키에 사용 된 ON DELETE SET NULL 모든 열을 사용하는 경우 null 값을 허용해야합니다. 다른 사람 이이 질문 에서 이것을 발견했습니다. .

내 이해로는 데이터 무결성과 관련하여 문제가되지 않지만 MySQL 은이 기능 (5.7)을 지원하지 않는 것 같습니다.


1

참조 된 테이블이 MyISAM 엔진을 사용하기 때문에이 오류가 발생하면이 답변은 데이터베이스를 변환하는 빠른 방법을 제공하므로 모든 Django 모델 테이블이 InnoDB를 사용합니다 : https://stackoverflow.com/a/15389961/2950621

convert_to_innodb라는 Django 관리 명령입니다.


1

와우 방금 받았어! 이미 게시 된 많은 답변 (innoDB, unsigned 등)이 혼합되어 있습니다. 내가 여기서 보지 못한 한 가지는 : FK가 PK를 가리키고 있다면 소스 열에 의미가있는 값을 갖는지 확인하십시오. 예를 들어 PK가 mediumint (8) 인 경우 소스 열에 mediumint (8)도 포함되어 있는지 확인하십시오. 그것은 나에게 문제의 일부였다.


1

나를 위해 그것은 열 유형이었습니다. BigINT! = INT.

그러나 여전히 작동하지 않았습니다.

그래서 나는 엔진을 점검했다. Table1 = InnoDB 및 Table = InnoDB인지 확인하십시오


1

완전히 다른 이유로이 오류가 발생했습니다. 내 데이터 모델을 만드는 데 MySQL Workbench 6.3을 사용했습니다 (굉장한 도구). 외래 키 제약 조건 정의에 정의 된 열 순서가 테이블 열 시퀀스에 맞지 않으면이 오류도 생성됩니다.

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

이제 모든 것이 잘 작동하고 코딩으로 돌아갈 수 있습니다. :-)


그게 무슨 뜻 이니?
Yazan Jaber

2
내가 생각 @YazanJaber 그는 뜻 : 이노 컬럼의 인덱스 열 또는 그룹을 참조하는 외부 키를 허용합니다. 그러나 참조 된 테이블에는 참조 된 열이 동일한 순서로 첫 번째 열로 나열되는 색인이 있어야합니다.
robsch

1

라 라벨 마이그레이션을 사용할 때 외래 키를 만들려고 할 때

이 예제와 같이 :

사용자 테이블

    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

이 오류는 [사용자 테이블]의 외래 키 (유형)가 [색상 테이블]의 기본 키 (유형)와 다르기 때문에 발생했습니다.

이 문제를 해결하려면 [색상 표]에서 기본 키를 변경해야합니다.

$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');

이것은 나를 도와줍니다. 내가 가지고 bigIncrements내가 사용하는 데 필요한, 그래서 기본 키로unsignedBigInteger
jagad89

1

필자의 경우 FOREIGN KEY소스 테이블이 없으므로 검사 를 비활성화해야했습니다 .

SET FOREIGN_KEY_CHECKS=0;


0

역 따옴표의 사용도 알고 있어야합니다. 나는 스크립트에서 다음 진술을했다

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은 불행히도이 오류에 대한 세부 정보를 제공하지 않습니다 ...


0

이 오류의 또 다른 원인은 동일한 외래 키 이름을 가진 둘 이상의 동일한 테이블 이름이 있다는 것입니다. 이것은 때때로 Mysql Workbench와 같은 모델링 및 디자인 소프트웨어를 사용하고 나중에 디자인에서 스크립트를 생성하는 사람들에게 발생합니다.


0

나는 파티에 너무 늦었다는 것을 알고 있지만 여기에 열거되어 있습니다.

필드가 동일하게 정의되고 테이블 유형도 동일한 데이터 정렬을 갖도록하는 위의 모든 조언뿐만 아니라 CHILD 필드의 데이터가 아닌 필드를 링크하려고 시도하는 신인 실수를하지 않아야합니다. 이미 부모 필드에 있습니다. 부모 필드에 아직 입력하지 않은 데이터가 어린이 필드에있는 경우이 오류가 발생합니다. 오류 메시지가 조금 더 도움이되지 않는 것은 부끄러운 일입니다.

확실하지 않으면 외래 키가있는 테이블을 백업하고 모든 데이터를 삭제 한 다음 외래 키를 만듭니다. 성공하면 어떻게해야합니까!

행운을 빕니다.


0

이것은 이미 언급 된 것의 미묘한 버전이지만 제 경우에는 2 개의 데이터베이스 (foo 및 bar)가 있습니다. 먼저 foo를 만들었고 bar.baz에서 외래 키를 참조한다는 것을 알지 못했습니다 (아직 만들지 않았습니다). bar.baz (외래 키없이)를 만들려고 할 때이 오류가 계속 발생했습니다. 잠시 둘러 본 후 foo에서 외래 키를 발견했습니다.

간단히 말해,이 오류가 발생하면 테이블에 이미 존재하는 외래 키가있을 수 있습니다.


0

나에게 1215 오류는로 작성된 덤프 파일을 가져올 때 발생했습니다 mysqldump. (이 페이지를 지적하면 https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/ )

mysqldump는 알파벳 순서로 테이블을 주문하고 테이블 이름을 변경하고 싶지 않기 때문에이 페이지 에서 JeremyWeir의 답변에 나온 지침을 따랐습니다 set FOREIGN_KEY_CHECKS = 0;. 덤프 파일의 맨 위에 놓고 덤프 파일 SET FOREIGN_KEY_CHECKS = 1;의 맨 아래에 놓습니다 . .

그 해결책은 저에게 효과적이었습니다.


0

그래서 위의 모든 수정 사항을 시도했지만 운이 없습니다. 내 테이블에 오류가 없을 수 있습니다. 원인을 찾을 수없고 오류 1215가 계속 발생합니다. 따라서이 수정 프로그램을 사용했습니다.

phpMyAdmin의 로컬 환경에서 문제의 테이블에서 데이터를 내보냈습니다. CSV 형식을 선택했습니다. phpMyAdmin에서 테이블을 선택한 상태에서 "More-> Options"를 선택했습니다. 여기에서 "테이블을 (database.table)에 복사"로 스크롤했습니다. "Structure only"를 선택하십시오. 테이블의 이름을 바꾸거나, 현재 테이블 이름 옆에 "copy"라는 단어를 추가하십시오. "Go"를 클릭하십시오. 새 테이블을 내 보낸 후 새 서버 나 다른 서버로 가져옵니다. 여기에서도 phpMyAdmin을 사용하고 있습니다. 가져온 후에는 테이블 이름을 원래 이름으로 다시 변경하고 새 테이블을 선택하고 가져 오기를 선택하십시오. 형식을 선택하려면 CSV를 선택하십시오. "외래 키 검사 사용"을 선택 취소하고 "이동"을 선택하십시오.

블로그에 수정 사항을 게시했습니다 .


-1

심지어 나는 같은 문제가 있었다. 그리고 결함은 FK의 테이블 PK에서 "서명되지 않은"마커에 있었다


-6

한 번 같은 오류가 발생했습니다. 방금 MySQL 서버를 다시 시작하고 문제를 해결했습니다.


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