programing

mysql 외부 키 제약 조건이 잘못된 형식 오류입니다.

minecode 2023. 1. 4. 20:28
반응형

mysql 외부 키 제약 조건이 잘못된 형식 오류입니다.

이 두 개 요.table1는 컬럼이 입니다.ID ★★★★★★★★★★★★★★★★★」table2이 붙어 있다IDFromTable1) 를 FK에 IDFromTable1로로 합니다.IDtable1Foreign key constraint is incorrectly formed error는 2의 경우 table1레코드가 삭제됩니다. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★▼

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

또 필요한 정보가 있으면 알려주세요.mysql은 처음입니다.

HeidiSQL에서도 같은 문제가 발생했습니다.당신이 받는 오류는 매우 이해하기 어렵습니다.문제는 외부 키 열과 참조 열이 같은 유형이나 길이가 아니라는 것입니다.

외부 키 열은 다음과 같습니다.SMALLINT(5) UNSIGNED된 컬럼은 ""입니다.INT(10) UNSIGNED둘 다 똑같은 타입으로 만들었을 때, 외부 키 작성은 완벽하게 동작했습니다.

있는 는 " " " " " 를 하십시오.SHOW ENGINE INNODB STATUS자세한 내용은 '최신 외부오류' 섹션을 참조하십시오.

'아까보다'를 사용해서 도 같은 .MyISAM진진gengen.gengine 릭릭다gg바보같은 실수야. 내가 그걸 고쳐놨지.

ALTER TABLE parent_table ENGINE=InnoDB;

종류), 이 아닌 열이 하지 않은지 확인하십시오.primary_key, 꼭, 꼭, 꼭, 꼭, 꼭, 꼭, 꼭, 꼭, 꼭INDEXED.

외부 키를 정의하기 위한 구문은 매우 관대하지만, 이것에 대해 문제가 있는 다른 사용자에게는 외부 키가 데이터 유형, 길이 및 비트 서명뿐만 아니라 "같은 유형"이어야 한다는 사실이 대조에도 적용됩니다.

모델 내에서 조합하는 것은 아니지만 조합할 경우 phpmyadmin 또는 Heidi SQL에서 프라이머리 키필드와 외부 키필드가 같은 조합 타입인지 확인합니다.

이것으로 4시간의 시행착오를 덜 수 있기를 바랍니다.

저도 같은 문제가 있었는데 해결했어요.

그 칼럼을 확인해 주세요.'table1'의 ID는 UNIQURE 인덱스를 가집니다!

물론 열의 종류, 길이도 마찬가지입니다.이 두 테이블의 ID'와 IDFromTable1은 같아야 합니다.하지만 당신은 이미 이것에 대해 알고 있다.

별로 이 되지 같은 에 '오류'라고요.not null있기 「아, 아, 아」라고 하는 것은on delete set null되지 않았다"

완성을 위해서.

이 에러는, VARCHAR(..)를 가지는 외부 키가 있고, 참조되고 있는 테이블의 문자 집합이 참조하고 있는 테이블과 다른 경우에도 마찬가지입니다.

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

이 에러가 표시되는 또 하나의 생각할 수 있는 원인입니다.표를 만드는 순서가 틀렸습니다.아직 작성되지 않은 테이블에서 키를 참조하려고 했습니다.

모든 것이 괜찮다면, 그냥 추가하세요.->unsigned();foregin key.

동작하지 않는 경우는, 양쪽 필드의 데이터 타입을 확인해 주세요.똑같아야 합니다.

같은 문제가 있었습니다.두 열 모두 INT(11) NOT NULL이지만 외부 키를 만들 수 없습니다.정상적으로 실행하기 위해 외부 키 체크를 비활성화해야 했습니다.

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

이게 도움이 됐으면 좋겠네요.

(마지막 재발송신) 필드명과 데이터 타입은 같지만 조합은 동일하지 않은 경우에도 이 문제가 발생합니다.

예를들면

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

활동ID | INT | latin1_general_ci 액티비티ID | INT | utf8_general_ci

변경해 보세요.

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

활동ID | INT | latin1_general_ci 액티비티ID | INT | latin1_general_ci

....

이건 나한테 효과가 있었어.

는 에서도 합니다.Laraveltable1table2.

순서를 지킬 수 .foreign key기능을 사용할 수 있습니다.

database/migrations/2020_01_01_00001_create_table2_table.php
database/migrations/2020_01_01_00002_create_table1_table.php

다음 항목이어야 합니다.

database/migrations/2020_01_01_00001_create_table1_table.php
database/migrations/2020_01_01_00002_create_table2_table.php

테이블 엔진을 확인해 보세요. 두 테이블이 같은 엔진이어야 하는데, 그게 제게 큰 도움이 됐어요.

다른 답변들도 꽤 도움이 되지만, 제 경험도 공유하고 싶었어요.

는 그 때 그 에 직면했다.id이미 다른 테이블(데이터 포함)에서 외부 키로 참조되고 있으며 추가 열을 사용하여 테이블을 다시 만들거나 가져오려고 했습니다.

레크리에이션 쿼리(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;

다음을 실행해 보십시오.

show create table 부모
//두 테이블의 유형이 동일한지 확인합니다.ISAM 또는 innoDB 등//이 에러 메시지에서 확인할 수 있는 기타 측면: 외부로 사용되는 열키는 색인화해야 합니다. 같은 유형이어야 합니다.(즉, 한쪽이 타입 smallint(5)이고 다른 한쪽이 타입 smallint(6)인 경우,작동하지 않습니다.) 그리고 정수일 경우 부호 없이 입력해야 합니다.

//또는 문자 집합 확인"character_set_set"과 같은 변수를 표시합니다.
"collation_displaces"와 같은 변수를 표시합니다.

//filename: 이와 같은 것을 시도합니다.테이블 변경2제약조건 추가 fk_IdTable2외부 키(표1_Id)참조표 1 (표 1_Id)업데이트 시 캐스케이드캐스케이드 삭제 시;

그것 때문에 몇 시간이나 졌어요!

한 테이블의 PK는utf8다른 것은utf8_unicode_ci!

고마워 SDoerin:

"완성을 위해서입니다.이 에러는, 외부 키에 VARCHAR(..)를 사용하고 있는 경우, 참조되고 있는 테이블의 문자 집합이 참조하고 있는 테이블과 다른 경우에도 마찬가지입니다.예를 들어 Latin1 테이블의 VARCHAR(50)은 UTF8 테이블의 VARCHAR(50)와 다릅니다."

나는 이 문제를 해결했고 표의 글자 종류를 바꿨다.creation에는 latin1이 있으며 올바른 값은 utf8입니다.

다음 행을 추가합니다.기본 문자 집합 = utf8;

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

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

그것을 주요 열쇠로 삼으면 문제가 해결된다.

제 경우는 참조란에 오타가 있는 경우입니다.

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

프라이머리 키를 다음과 같은 다른 데이터 타입에 넣을 때 발생하는 에러입니다.

표 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에 대한 데이터 형식은 증분이어야 합니다.

이 문제에 대해 고민하고 있는 분들을 위해, 이것은 제 문제였습니다.

필드를 VARCHAR(16)에서 VARCHAR(25)로 변경하기 위해 테이블을 변경하려고 했는데, 이는 데이터 유형이 VARCHAR(16)인 다른 테이블 열을 참조하고 있었습니다.

Symfony 2.8에서도 같은 문제가 있었습니다.

해외 키 길이 등에 비슷한 문제가 없었기 때문에 처음에는 받지 못했습니다.

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

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

Alter 테이블을 사용하여 2개의 테이블 사이에 외부 키를 추가하는 데 문제가 있었습니다.외부 키 관계를 추가하려는 각 열이 색인화되어 있는지 확인하는 데 도움이 되었습니다.PHP myAdmin에서 이를 수행하려면 테이블로 이동하여 structure 탭을 클릭합니다.스크린샷에 표시된 대로 인덱스 옵션을 클릭하여 원하는 열을 인덱싱합니다.

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

양쪽 테이블에 zip_code가 어떻게 표시되는지 주의해 주세요.

"Collation"을 포함한 모든 속성이 동일한지 확인해야 합니다.

저는 HeidiSQL을 사용하고 있었는데, 이 문제를 해결하기 위해 모든 이 참조되는 참조 테이블에 인덱스를 작성해야 했습니다.

테이블에 인덱스 추가 Heidisql

저도 방금 같은 문제에 부딪혔어요.이 경우 외부 키에서 참조하는 테이블이 현재 테이블(코드의 이전)보다 먼저 작성되어야 합니다.따라서 변수(x*5)를 참조하는 경우 시스템은 x를 인식해야 합니다(x는 코드 앞줄로 선언해야 합니다).이것으로 문제가 해결되었습니다.다른 사람에게 도움이 되길 바랍니다.

MariaDB 10.1을 사용한 Larabel 5.1 이행 Schema Builder에서도 같은 문제가 발생했습니다.

는 제가 '를했다'는 이었습니다.unignedunsigned(the)s(미국의

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

저도 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.

적절한 대소문자로 테이블 이름을 지정했는지 확인합니다(데이터베이스에서 테이블 이름이 대소문자를 구분하는 경우).내 경우엔 옷을 갈아입어야 했다.

 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로 changed to 로 변경되다CUSTOMER.

언급URL : https://stackoverflow.com/questions/8434518/mysql-foreign-key-constraint-is-incorrectly-formed-error

반응형