mysql 외래 키 제약 조건이 잘못 형성 오류


173

나는 두 개의 테이블을 가지고, table1열 함께 부모 테이블 IDtable2컬럼에 IDFromTable1나는에 FK를 넣어 (이 아닌 실제 이름) IDFromTable1ID에서 table1나는 오류를 얻을 Foreign key constraint is incorrectly formed error. table1레코드가 삭제 되면 표 2 레코드를 삭제하고 싶습니다 . 도움을 주셔서 감사합니다

ALTER TABLE `table2`  
   ADD CONSTRAINT `FK1` 
      FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`) 
      ON UPDATE CASCADE 
      ON DELETE CASCADE;

다른 정보가 필요하면 알려주십시오. 나는 mysql을 처음 사용한다


4
테이블에 어떤 엔진을 사용하고 있습니까? 의 종류 무엇 table2.IDFromTable1table1.ID?
Romain

5
또한 두 테이블의 문자 세트가 동일한 지 확인하십시오.
Carsten

두 테이블 엔진 모두 innoDB입니다. 문자 세트를 찾을 위치를 모르고 둘 다 문자 유형입니다. ID는 테이블 1의 기본 키
user516883

2
table1 및 table2에 대한 테이블 정의를 제공하십시오. 이 오류는 어떻게 발생 했습니까? 외래 키를 만드는 도구를 사용합니까? MySQL 기본 오류가 아닌 것 같습니다.
Devart

@ user516883-테이블 정의를 얻는 데 도움이 필요하십니까? HeidiSQL에서는 CREATE 코드 탭을 클릭하기 만하면 됩니다.
Álvaro González

답변:


422

HeidiSQL에서도 이와 동일한 문제가 발생했습니다. 당신이받는 오류는 매우 비밀입니다. 내 문제는 외래 키 열과 참조 열의 유형이나 길이가 같지 않다는 것입니다.

외래 키 열은 SMALLINT(5) UNSIGNED이고 참조 열은 INT(10) UNSIGNED입니다. 두 가지를 모두 동일한 유형으로 만들면 외래 키 생성이 완벽하게 작동했습니다.


58
또는 참조 된 열이 기본 키가 아닐 수도 있습니다.
nawfal

9
나에게 비슷한 문제가있다-참조 된 테이블이 아직 존재하지 않았다. 으악.
Amalgovinus

5
나는 Jake가 한 일을 완전히 경험했지만 HeidiSQL에 대한 다른 FK 문제 (다른 유형)에 부딪 쳤습니다. varchars의 FK는 동일한 데이터 정렬이어야합니다. 앞으로 다른 사람을 도울 희망!
cbloss793

10
내 경우에는 다른 인코딩 및 데이터 정렬 때문이었습니다.
Khatri

1
@nawfal-반드시 기본 키 일 필요는 없지만 색인이 있어야한다고 생각합니다. 기본 키는 자동으로 색인화됩니다.
Itai

48

MyISAM엔진을 사용하여 부모 테이블을 만들 때 동일한 문제가 발생했습니다 . 바보 같은 실수입니다.

ALTER TABLE parent_table ENGINE=InnoDB;

정말 고마워요 데이터베이스가 갑자기 엔진을 테이블로 바꾸는 이유를 알고 있습니까?
Robert Franklin

28

열이 동일한 유형 primary_key인지 확인하고 참조 열이 아닌 경우 확인하십시오 INDEXED.


심지어 오류가 없었지만 외래 키가 추가되지는 않았지만 (1과 1은 실제로는 그렇지 않았습니다), 외래 키를 정의하기 KEY referencing_column(referencing_column) 전에 간단한 추가 후 모두 성공적으로 추가되었습니다 :)
jave.web

2
색인이 생성되지 않은 키가 내 문제였습니다.
닐 마스터즈

1
나는이 문제가 있었고 문제는 이중 열 기본 키가 있었고 기본 키의 두 번째 열을 외래 키로 사용할 수 없다는 것입니다. 그래서 방금 기본 키의 두 번째 열에 대한 자체 색인을 추가 한 다음 작동했습니다.
Firze

21

외래 키를 정의하는 구문은 매우 관대하지만, 다른 사람이 외면 키를 "동일한 유형"으로 만들어야한다는 사실은 데이터 형식과 길이 및 비트 서명뿐만 아니라 데이터 정렬에도 적용됩니다.

모델에서 데이터 정렬을 혼합하지는 않겠지 만 (그렇게 하시겠습니까?) 그렇지 않으면 기본 및 외래 키 필드가 phpmyadmin 또는 Heidi SQL 또는 사용하는 모든 데이터 정렬 유형과 동일한 지 확인하십시오.

이것이 4 시간의 시행 착오를 덜어주기를 바랍니다.


1
감사! 온라인 호스트는 ISAM 엔진을 사용하고 로컬 개발자에게는 InnoDB를 사용합니다. 호스트에서 로컬로 테이블을 백업했을 때 ... 붐.
Ben

최신 버전의 MariaDB는 utf8_mb4를 기본 문자 세트로 사용하는 것 같습니다 (서버 구성에서 명시 적으로 설정하지 COLLATE utf8mb4_unicode_ci않은 경우) (예기치 않은) 문제 (개발자 컴퓨터에서)였습니다.
JonnyJD

13

나는 같은 문제가 있었지만 해결했다.

'table1'의 열 'ID'에 UNIQUE 색인 이 있는지 확인하십시오 !

물론이 두 테이블의 유형 'ID'와 'IDFromTable1'의 길이는 같아야합니다. 그러나 당신은 이미 이것에 대해 알고 있습니다.


당신은 내 하루를 만들었습니다.
kevenlolo

1
기쁘다! ;)
Renat Gatin

세부 사항을 확신하지 못했지만이 오류가있는 복합 키가 있었지만 열에 개별 고유 인덱스를 추가하여 수정되었습니다.
Halvor Holsten Strand

참조 된 열은 색인을 생성해야하며 고유 할 필요는 없습니다 (일반적인 경우이지만).
Barmar

10

그냥 완료하십시오.

VARCHAR (..)의 외래 키가 있고 참조 된 테이블의 문자 집합이이를 참조하는 테이블과 다른 경우이 오류가 발생할 수 있습니다.

예를 들어 Latin1 테이블의 VARCHAR (50)은 UTF8 테이블의 VARCHAR (50)과 다릅니다.


1
utf8_unicode_ci와 utf8_general_ci조차도 오류를 일으킨다
leuchtdiode

10

mysql 오류 텍스트는 그다지 도움이되지 않습니다. 제 경우에는 열에 "not null"제약 조건이 있으므로 "on delete set null"이 허용되지 않았습니다.


7

모든 것이 정상이면 ->unsigned();끝에 추가하십시오 foregin key.

작동하지 않으면 두 필드의 데이터 유형을 확인하십시오. 그들은 같아야합니다.


5

같은 문제가 있었지만 두 열 모두 INT (11) NOT NULL이지만 외래 키를 만들 수 없습니다. 외래 키 검사를 비활성화하여 성공적으로 실행해야했습니다.

SET FOREIGN_KEY_CHECKS=OFF;
ALTER TABLE ... ADD CONSTRAINT ...
SET FOREIGN_KEY_CHECKS=ON;

이것이 누군가를 돕기를 바랍니다.


4
실제로 그것은 FOREIGN_KEY_CHECKS
Xmanoux

이것은 나를 더 통과,하지만 내 문제는 열에 primmary 인덱스 실종됐다 도움을했다
bumerang

4

이 오류가 표시 될 가능성이 한 가지 더 있습니다. 내가 테이블을 생성하는 순서가 잘못되었습니다. 아직 생성되지 않은 테이블에서 키를 참조하려고했습니다.


4

(마지막 재전송) 필드 이름과 데이터 유형이 동일하지만 데이터 정렬이 동일하지 않더라도 해당 문제가 발생합니다.

예를 들어

    TBL 이름 | 데이터 유형 | 대조        

    ActivityID | INT |         latin1_general_ci     ActivityID | INT |         utf8_general_ci

로 변경해보십시오

    TBL 이름 | 데이터 유형 | 대조        

    ActivityID | INT |         latin1_general_ci     ActivityID | INT |         latin1_general_ci

....

이것은 나를 위해 일했습니다.


3

테이블 엔진을 확인하십시오. 두 테이블은 모두 동일한 엔진이어야하므로 많은 도움이되었습니다.


좋은 지적! 기본적으로 MyISAM 엔진에 테이블이있는 MySQL의 Zen Cart 데이터베이스를 처리하고 있습니다. InnoDB 엔진을 사용하여 테이블을 추가하고 테이블의 외래 키 제약 조건을 핵심 Zen Cart에 추가하려고했습니다. 이 모호한 '잘못된 형식'오류로 인해 실패했습니다. 다음과 같이 각 테이블의 엔진을 볼 수 있습니다.SHOW TABLE STATUS LIKE 'table_name';
Neek

2

나는 같은 문제가 있었다.

문제는 참조 열이 기본 키가 아니라는 것입니다.

기본 키로 설정하면 문제가 해결됩니다.


PK 일 필요는 없으며 UNIQUE NOT NULL 일 수도 있습니다.
philipxy

사실 ... 제 경우에는 단순히 인덱스 유형으로 설정하면 정상적으로 작동합니다.
hendr1x

2

다른 답변이 도움이되었지만 내 경험을 공유하고 싶었습니다.

id다른 테이블에서 이미 외래 키 ( data 포함 ) 로 참조 된 테이블을 삭제하고 추가 열이있는 테이블을 다시 만들거나 가져 오려고 할 때 문제가 발생했습니다 .

레크리에이션에 대한 쿼리 (phpMyAdmin에서 생성)는 다음과 같습니다.

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL,            /* No PRIMARY KEY index */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

... /* SOME DATA DUMP OPERATION */

ALTER TABLE `the_table`
  ADD PRIMARY KEY (`id`), /* PRIMARY KEY INDEX */
  ADD UNIQUE KEY `uk_acu_donor_name` (`name`);

알다시피, PRIMARY KEY색인은 문제의 원인이 된 데이터를 생성 하고 삽입 한 후에 설정되었습니다 .

해결책

해결책은 외래 키로 참조되는 PRIMARY KEY테이블 정의 쿼리에 대한 인덱스 를 추가하는 id동시에 ALTER TABLE인덱스가 설정된 부분에서 인덱스를 제거하는 것입니다.

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL PRIMARY KEY,            /* <<== PRIMARY KEY INDEX ON CREATION */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

그것은 나를 위해 일했습니다. 소프트웨어를 다시 설치해야한다고 걱정했습니다.)
Dewlance

2

나는 그것을 위해 몇 시간 동안졌다!

한 테이블의 PK는 다른 테이블 utf8이었습니다 utf8_unicode_ci!


1

다음을 실행하십시오.

쇼 테이블 만들기 부모

// myISAM 또는 innoDB 등과 같이 두 테이블의 유형이 동일한 지 확인하십시오.
//이 오류 메시지로 확인해야 할 다른 측면 : 외부로 사용 된 열 
키는 색인화되어야하며 동일한 유형이어야합니다. 
(즉, 하나가 smallint (5) 유형이고 다른 하나가 smallint (6) 유형 인 경우, 
작동하지 않습니다), 정수인 경우 부호가 없어야합니다.

// 또는 문자셋을 확인
"character_set_database"와 같은 변수를 표시합니다.
"collation_database"와 같은 변수를 표시합니다.

// 편집 : 다음과 같이 해보십시오
ALTER TABLE 표 2
제약 조건 추가 fk_IdTable2
외래 키 (Table1_Id)
참조 Table1 (Table1_Id)
업데이트 캐스케이드 
삭제시 캐스케이드;

9
오류에 대한 자세한 내용을 보려면 SHOW ENGINE INNODB STATUS를 실행하십시오
Sudhir Bastakoti

@SudhirBastakoti-+1! 그것은 나를 위해 그것을했다. 자세한 내용은 도움이됩니다. 문제를 빠르게 해결할 수있었습니다.
Paul Carlton

1

Symfony 2.8과 동일한 문제가있었습니다.

외래 키의 int 길이와 비슷한 문제가 없기 때문에 처음에는 얻지 못했습니다.

마지막으로 프로젝트 폴더에서 다음을 수행해야했습니다. (서버를 다시 시작해도 도움이되지 않았습니다!)

app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result


1

감사합니다 S Doerin :

"완료 완료.이 오류는 VARCHAR (..)의 외래 키가 있고 참조 된 테이블의 문자 세트가이를 참조하는 테이블과 다른 경우에도 마찬가지입니다. 예를 들어 Latin1 테이블의 VARCHAR (50)은 다음과 같습니다. UTF8 테이블의 VARCHAR (50)과 다릅니다. "

나는이 문제를 해결하여 테이블의 문자 유형을 변경했습니다. 생성에는 latin1이 있고 올바른 것은 utf8입니다.

다음 줄을 추가하십시오. 기본 문자 세트 = utf8;


1

Alter 테이블을 사용하여 두 테이블 사이에 외래 키를 추가하는 데 문제가 있었고 외래 키 관계를 추가하려고하는 각 열이 인덱스되도록하는 데 도움이되었습니다. PHP myAdmin에서이를 수행하려면 : 테이블로 이동하여 구조 탭을 클릭하십시오. 스크린 샷에 표시된대로 색인 옵션을 클릭하여 원하는 열을 색인화하십시오.

여기에 이미지 설명을 입력하십시오

두 열을 모두 색인화하면 외래 키를 참조하려고 시도했지만 alter 테이블을 성공적으로 사용하고 외래 키 관계를 만들 수있었습니다. 아래 스크린 샷과 같이 열이 색인화되어 있음을 알 수 있습니다.

여기에 이미지 설명을 입력하십시오

zip_code가 두 테이블에 어떻게 나타나는지 확인하십시오.


1

"수집"을 포함하여 모든 속성에서 동일한 지 확인해야합니다.


1

나는 HeidiSQL 을 사용하고 있었고이 문제를 해결하기 위해 모든 열이 참조되는 참조 테이블에 인덱스만들어야했습니다 .

테이블 Heidisql에 인덱스 추가


mysql에서와 동일 : InnoDB는 외래 키 및 참조 키에 대한 인덱스가 필요하므로 외래 키 검사가 빠르며 테이블 스캔이 필요하지 않습니다.
hendr1x

1

나는 지금 바로 같은 문제에 부딪쳤다. 필자의 경우 외래 키에서 참조하는 테이블을 현재 테이블 (코드 앞 부분)보다 먼저 만들어야합니다. 따라서 변수 (x * 5)를 참조하는 경우 시스템은 x가 무엇인지 알아야합니다 (x는 이전 코드 행에서 선언되어야 함). 이것은 내 문제를 해결했습니다. 다른 사람을 도울 수 있기를 바랍니다.


MariaDB v10.3.18에서 동일한 문제가 발생했습니다. 우리는 이전에 MySQL을 사용했으며 외래 키가 존재하지 않는 테이블을 가리켰다 고 경고했습니다.
MarthyM

0

MariaDB 10.1을 사용하는 Laravel 5.1 마이그레이션 스키마 빌더와 동일한 문제가있었습니다.

문제는 내가 입력했던 것이 었습니다 unigned대신 unsigned합니다 ( s열을 설정하는 동안 편지가 누락되었다).

오타 수정 후 오류가 수정되었습니다.


0

심지어 mysql 및 liquibase와 동일한 문제가 발생했습니다. 따라서 이것이 문제입니다. 다른 테이블의 열을 참조하려는 테이블은 데이터 유형의 경우 또는 데이터 유형의 크기면에서 다릅니다.

Error appears in below scenario:
Scenario 1:
Table A has column id, type=bigint
Table B column referenced_id type varchar(this column gets the value from the id column of Table A.)
Liquibase changeset for table B:

    <changeset id="XXXXXXXXXXX-1" author="xyz">
            <column name="referenced_id" **type="varchar"**>
        </column>
            </changeset>
    <changeSet id="XXXXXXXXXXX-2" author="xyz">
                <addForeignKeyConstraint constraintName="FK_table_A"
                    referencedTableName="A" **baseColumnNames="referenced_id**"
                    referencedColumnNames="id" baseTableName="B" />
    </changeSet>

Table A changeSet:

    <changeSet id="YYYYYYYYYY" author="xyz">
     <column **name="id"** **type="bigint"** autoIncrement="${autoIncrement}">
                    <constraints primaryKey="true" nullable="false"/>
                </column>
    </changeSet>

Solution: 
correct the type of table B to bigint because the referenced table has type bigint.

Scenrario 2:
The type might be correct but the size might not.
e.g. :
Table B : referenced column type="varchar 50"
Table A : base column type ="varchar 255"

Solution change the size of referenced column to that of base table's column size.

0

올바른 경우에 테이블 이름을 지정했는지 확인하십시오 (데이터베이스에서 테이블 이름이 대소 문자를 구분하는 경우). 제 경우에는 변경해야했습니다

 CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON UPDATE CASCADE ON DELETE CASCADE

 CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `CUSTOMER` (`id`) ON UPDATE CASCADE ON DELETE CASCADE

customer변경 되었음을 유의하십시오 CUSTOMER.


0

또는 그래픽 인터페이스가있는 DBDesigner4를 사용하여 데이터베이스를 작성하고 FK를 사용하여 데이터베이스를 링크 할 수 있습니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 코드를 생성하는 'Copy Table SQL Create'를 선택하십시오.

여기에 이미지 설명을 입력하십시오


0

오래된 주제이지만 뭔가를 발견했습니다. MySQL 워크 벤치를 구축하는 동안 다른 테이블의 관계도 얻습니다. 관련된 기둥을 그대로 두십시오. 자동으로 추가 된 다른 열을 지 웁니다. 이것은 나를 위해 작동합니다.


0

내 사례는 참조 열에 오타가 있다는 것입니다.

MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( coutry_code );
ERROR 1005 (HY000): Can't create table `blog`.`t_user` (errno: 150 "Foreign key constraint is incorrectly formed")

오류 메시지는 매우 비밀스럽고 열, 데이터 정렬, 엔진 등의 유형을 확인하는 모든 것을 시도했습니다.

오타에 주목하는 데 잠시 시간이 걸렸으며 수정 후 모두 정상적으로 작동했습니다.

MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( country_code );
Query OK, 2 rows affected (0.039 sec)              
Records: 2  Duplicates: 0  Warnings: 0

0

이 문제에 직면하면 기본 키를 다른 데이터 형식으로 넣을 때 오류가 발생했습니다.

1 번 테이블:

 Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('product_name');
        });

표 2 :

Schema::create('brands', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('brand_name');
        });

두 번째 테이블의 id에 대한 데이터 유형은 증분 이어야합니다.


0

문제는 해결하기가 매우 간단합니다

예 : 이름이 usersposts 인 두 개의 테이블이 있고 posts 테이블에 외래 키 를 만들고 phpMyAdmin 을 사용합니다.

1)에 게시 테이블에 추가 할 새 열 ( 이름 | use_id : 유형을 다음과 같이 아이디사용자 테이블 | 길이 : 같은 아이디사용자 테이블 | 기본값 : NULL | 속성 : 서명되지 않은 | 색인 : 색인)

2) 구조 탭에서 관계보기 로 이동하십시오 ( 제약 이름 : phpmyAdmin에 의해 자동 설정 | 열 이름 : select user_id | table : users | key : id, ...)

간단하게 해결되었습니다

자바 모사 비이란

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