복붙노트

[SQL] MySQL의 외래 키 제약 조건은 잘못 오류가 형성된다

SQL

MySQL의 외래 키 제약 조건은 잘못 오류가 형성된다

나는 두 개의 테이블을 가지고, 표는 내가 오류 외래 키 제약 조건은 잘못 오류가 형성된다 얻을 표에서 ID에 IDFromTable1에 FK를 넣어 열 IDFromTable1 (안 실제 이름)와 열 ID 및 표 2와 부모 테이블입니다. 나는 표 레코드가 삭제됩니다 경우 테이블이 레코드를 삭제하고 싶습니다. 어떤 도움을 주셔서 감사합니다

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

기타 정보가 필요한 경우 알려주세요. 나는 MySQL로 새로운 오전

해결법

  1. ==============================

    1.나는 HeidiSQL이 같은 문제 다 퉜다. 나타나는 오류는 매우 비밀이다. 내 문제는 외래 키 컬럼과 참조하는 열이 동일한 유형 또는 길이 없었던 었죠.

    나는 HeidiSQL이 같은 문제 다 퉜다. 나타나는 오류는 매우 비밀이다. 내 문제는 외래 키 컬럼과 참조하는 열이 동일한 유형 또는 길이 없었던 었죠.

    외래 키 컬럼 SMALLINT (5) UNSIGNED이고 참조 컬럼 INT (10) UNSIGNED이었다. 내가 그들에게 똑같은 유형을 모두 만든 후에는 외래 키 생성은 완벽했다.

  2. ==============================

    2.부모 테이블의 MyISAM 엔진을 사용하여 만들 때 저도 같은 문제가 있었다. 내가 고정 바보 같은 실수입니다 :

    부모 테이블의 MyISAM 엔진을 사용하여 만들 때 저도 같은 문제가 있었다. 내가 고정 바보 같은 실수입니다 :

    ALTER TABLE parent_table ENGINE=InnoDB;
    
  3. ==============================

    3.반드시 열 (동일 유형)과 동일한 기준 컬럼 primary_key와없는 경우가 반드시 색인하게 만든다.

    반드시 열 (동일 유형)과 동일한 기준 컬럼 primary_key와없는 경우가 반드시 색인하게 만든다.

  4. ==============================

    4.외부 키를 정의하는 구문은 매우 용서하지만, 누군가를 위해 다른이에 일인가되어, 외래 키는 "같은 종류의"해야한다는 사실조차 정렬뿐 아니라 데이터 유형 및 길이와 비트 서명에 적용됩니다.

    외부 키를 정의하는 구문은 매우 용서하지만, 누군가를 위해 다른이에 일인가되어, 외래 키는 "같은 종류의"해야한다는 사실조차 정렬뿐 아니라 데이터 유형 및 길이와 비트 서명에 적용됩니다.

    당신은 (? 당신을 것이다) 모델의 정렬을 혼합하지만, 당신이 할 경우, 반드시 기본 및 외래 키 필드에 phpMyAdmin 또는 하이디 SQL 또는 당신이 무엇을 사용하는 동일한 데이터 정렬 유형입니다 것하지 않는 것이.

    이 당신에게 시행 착오의 사시간 그것은 나를 비용을 절약 할 수 있기를 바랍니다.

  5. ==============================

    5.나는 같은 문제가 있었다, 그러나 그것을 해결했다.

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

    그냥 '표 1'의 열 'ID가'UNIQUE 인덱스를 가지고 있는지 확인하십시오!

    물론 유형으로,이 두 테이블의 열 'ID'와 'IDFromTable1'의 길이는 동일해야한다. 하지만 당신은 이미 이것에 대해 알고있다.

  6. ==============================

    6.그냥 완료.

    그냥 완료.

    당신이 그것을 참조하는 테이블에서 다른 VARCHAR와 외래 키 (..) 및 참조 된 테이블의 캐릭터 세트가있는 경우이 오류뿐만 아니라 경우가 있습니다.

    예를 들면 라틴 표 VARCHAR (50)는 UTF8 테이블에 VARCHAR (50)과 다르다.

  7. ==============================

    7."삭제 설정 널 (null)에"허용되지 그래서 MySQL의 오류 텍스트는, 열이, "NOT NULL"제약 조건을 가지고 내 경우에는 너무 많은 도움이되지 않습니다

    "삭제 설정 널 (null)에"허용되지 그래서 MySQL의 오류 텍스트는, 열이, "NOT NULL"제약 조건을 가지고 내 경우에는 너무 많은 도움이되지 않습니다

  8. ==============================

    8.모든 것이 괜찮 경우, 단지 추가 -> 부호 (); 외부 키의 말에.

    모든 것이 괜찮 경우, 단지 추가 -> 부호 (); 외부 키의 말에.

    그것이 작동하지 않는 경우, 두 필드의 데이터 유형을 확인합니다. 그들은 동일해야합니다.

  9. ==============================

    9.저도 같은 문제를 가지고, 모두 열은 NULL INT (11) NOT했다하지만 난 외래 키를 만들 수 wan't. 나는 성공적으로 실행하지 않도록 외래 키 검사를했다 :

    저도 같은 문제를 가지고, 모두 열은 NULL INT (11) NOT했다하지만 난 외래 키를 만들 수 wan't. 나는 성공적으로 실행하지 않도록 외래 키 검사를했다 :

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

    이 사람을 도움이되기를 바랍니다.

  10. ==============================

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

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

    예를 들면

    로 변경 시도

    ....

    이것은 나를 위해 일했다.

  11. ==============================

    11.이 오류의 표시에 대한 또 하나의 가능한 원인. 나는 테이블을 생성 된 순서가 잘못되었습니다. 아직 작성되지 않은 테이블에서 키를 참조하려고했다.

    이 오류의 표시에 대한 또 하나의 가능한 원인. 나는 테이블을 생성 된 순서가 잘못되었습니다. 아직 작성되지 않은 테이블에서 키를 참조하려고했다.

  12. ==============================

    12.다른 답변은 매우 유용하지만, 단지뿐만 아니라 내 경험을 공유하고 싶었다.

    다른 답변은 매우 유용하지만, 단지뿐만 아니라 내 경험을 공유하고 싶었다.

    내가 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`);
    

    사용자가 알 수있는 바와 같이, 기본 키 인덱스는 문제를 일으키는 생성 (데이터의 삽입) 후 하였다.

    또한이 솔루션은 인덱스가 설정되는 한 ALTER TABLE 부분에서 그것을 제거하는 동안, 외래 키로 참조되고 있던 ID에 대한 테이블 정의 쿼리에 PRIMARY KEY 인덱스를 추가했다 :

    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;
    
  13. ==============================

    13.나는 그것을위한 시간 손실!

    나는 그것을위한 시간 손실!

    하나 개의 테이블에서 PK는 다른에서 UTF8은 utf8_unicode_ci이었다!

  14. ==============================

    14.다음 실행 해보십시오 :

    다음 실행 해보십시오 :

    show create table Parent
    
    //and check if type for both tables are the same, like myISAM or innoDB, etc
    //Other aspects to check with this error message: the columns used as foreign 
    keys must be indexed, they must be of the same type 
    (if i.e one is of type smallint(5) and the other of type smallint(6), 
    it won't work), and, if they are integers, they should be unsigned.
    
    //or check for charsets
    show variables like "character_set_database";
    show variables like "collation_database";
    
    //edited: try something like this
    ALTER TABLE table2
    ADD CONSTRAINT fk_IdTable2
    FOREIGN KEY (Table1_Id)
    REFERENCES Table1(Table1_Id)
    ON UPDATE CASCADE 
    ON DELETE CASCADE;
    
  15. ==============================

    15.나는 심포니 2.8과 같은 문제가 있었다.

    나는 심포니 2.8과 같은 문제가 있었다.

    외래 키 등의 INT 길이 더 유사한 문제가 없었다 때문에 나는 처음에 그것을 얻을하지 않았다

    마지막으로 나는 프로젝트 폴더에서 다음을 수행했다. (A 서버를 다시 시작 도움이하지 않았다!)

    응용 프로그램 / 콘솔 교리 : 캐시 : 투명 - 메타 데이터  응용 프로그램 / 콘솔 교리 : 캐시 : 투명 쿼리  응용 프로그램 / 콘솔 교리 : 캐시 : 명확한 결과

  16. ==============================

    16.덕분에 S Doerin :

    덕분에 S Doerin :

    "그냥 완료. 당신이 그것을 참조하는 테이블에서 다른 VARCHAR와 외래 키 (..) 및 참조 된 테이블의 캐릭터 세트가있는 경우이 오류뿐만 아니라 경우가 있습니다. 예를 들면 라틴 표 (50)는 UTF8 VARCHAR 표의 VARCHAR (50)과 다르다. "

    나는 테이블의 문자의 유형을 변경,이 문제를 해결했다. 창조는 라틴가 올바른은 UTF8입니다.

    다음 줄을 추가합니다. 기본 문자 SET = UTF8;

  17. ==============================

    17.나는 두 개의 테이블과 나 확실히 내가 색인 된에 외래 키 관계를 추가하려고 것을 각 열을 만들고 있었다 도움을 준 일 사이에 외래 키를 추가 할 알터 테이블을 사용하여 문제를 가지고 있었다. PHP myAdmin에서이 작업을 수행하려면 : 테이블로 이동하여 구조 탭을 클릭합니다. 스크린 샷과 같이 인덱스에 원하는 열을 인덱스 옵션을 클릭합니다 :

    나는 두 개의 테이블과 나 확실히 내가 색인 된에 외래 키 관계를 추가하려고 것을 각 열을 만들고 있었다 도움을 준 일 사이에 외래 키를 추가 할 알터 테이블을 사용하여 문제를 가지고 있었다. PHP myAdmin에서이 작업을 수행하려면 : 테이블로 이동하여 구조 탭을 클릭합니다. 스크린 샷과 같이 인덱스에 원하는 열을 인덱스 옵션을 클릭합니다 :

    나는 내 외래 키와 참조하려고 한 두 열을 인덱싱하면, 나는 성공적으로 ALTER 테이블을 사용하고 외래 키 관계를 만들 수 있었다. 당신은 열이 아래의 스크린 샷에서와 같은 색인 것을 볼 수 있습니다 :

    두 테이블에서 최대 통지 방법 ZIP_CODE 보여줍니다.

  18. ==============================

    18.저도 같은 문제가 있었다.

    저도 같은 문제가 있었다.

    문제는, 기준 열 기본 키하지 않다.

    그것은 기본 키 확인하고 문제는 해결된다.

  19. ==============================

    19.당신은 모두가 "정렬"에 포함, 모든 속성 같은 것이 확인 필요

    당신은 모두가 "정렬"에 포함, 모든 속성 같은 것이 확인 필요

  20. ==============================

    20.테이블 엔진을 확인, 두 테이블은 너무 나에게 도움이, 동일한 엔진해야합니다.

    테이블 엔진을 확인, 두 테이블은 너무 나에게 도움이, 동일한 엔진해야합니다.

  21. ==============================

    21.나는 HeidiSQL을 사용하고 있었고, 난이 모든 열이 참조되는에 참조 된 테이블에 인덱스를 생성했다이 문제를 해결하기 위해.

    나는 HeidiSQL을 사용하고 있었고, 난이 모든 열이 참조되는에 참조 된 테이블에 인덱스를 생성했다이 문제를 해결하기 위해.

  22. ==============================

    22.난 그냥 지금 같은 문제 다 퉜다. 내 경우에는, 모두 내가해야 할 일을했을 것은 확실히 내가 외래 키에서 참조하고있는 테이블이 현재 테이블 (코드에서 이전) 이전에 작성해야합니다 있는지 확인하는 것입니다. 당신이 변수 (X * 5) 시스템이 무엇 X 알아야를 참조하는 경우 그래서 (X는 코드의 이전 라인에 선언되어야한다). 이것은 내 문제 해결이 다른 사람을 도움 바랍니다.

    난 그냥 지금 같은 문제 다 퉜다. 내 경우에는, 모두 내가해야 할 일을했을 것은 확실히 내가 외래 키에서 참조하고있는 테이블이 현재 테이블 (코드에서 이전) 이전에 작성해야합니다 있는지 확인하는 것입니다. 당신이 변수 (X * 5) 시스템이 무엇 X 알아야를 참조하는 경우 그래서 (X는 코드의 이전 라인에 선언되어야한다). 이것은 내 문제 해결이 다른 사람을 도움 바랍니다.

  23. ==============================

    23.나는 MariaDB 10.1 Laravel 5.1 마이그레이션 스키마 빌더와 같은 문제가 있었다.

    나는 MariaDB 10.1 Laravel 5.1 마이그레이션 스키마 빌더와 같은 문제가 있었다.

    문제는 열을 설정하는 동안 내가 (의 S 문자가 누락 된) 대신 부호의 unigned 입력 한 것이 었습니다.

    고정 후 오타 오류가 나를 위해 수정되었습니다.

  24. ==============================

    24.심지어 내가 MySQL과 liquibase와 같은 문제 다 퉜다.     이 그래서 문제가 무엇인지입니다 :     다른 테이블의 열을 참조하려는 테이블은 데이터 타입의 경우 또는 데이터 타입의 크기 측면에서 하나 다릅니다.

    심지어 내가 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.
    
  25. ==============================

    25.(테이블 이름은 대소 문자를 구분하여 데이터베이스에있는 경우) 적절한 경우 테이블의 이름을 지정했는지 확인하십시오. 내 경우에는 내가 변경했다

    (테이블 이름은 대소 문자를 구분하여 데이터베이스에있는 경우) 적절한 경우 테이블의 이름을 지정했는지 확인하십시오. 내 경우에는 내가 변경했다

     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
    

    고객 변경 고객을 확인합니다.

  26. ==============================

    26.또는 당신은 당신의 데이터베이스와 FK를 사용하여 연결을 만들 수있는 그래픽 인터페이스를 가지고 DBDesigner4를 사용할 수 있습니다. 오른쪽 테이블을 클릭하고 코드를 생성하는 '복사 표 SQL 만들기'를 선택합니다.

    또는 당신은 당신의 데이터베이스와 FK를 사용하여 연결을 만들 수있는 그래픽 인터페이스를 가지고 DBDesigner4를 사용할 수 있습니다. 오른쪽 테이블을 클릭하고 코드를 생성하는 '복사 표 SQL 만들기'를 선택합니다.

  27. ==============================

    27.그것은 오래된 주제이다하지만 난 뭔가를 발견했다. MySQL의 워크 벤치를 구축하는 동안, 그것은 또한 다른 테이블의 관계를 가져옵니다. 당신이 관련 기둥을 둡니다. 지우기 다른 자동으로 추가 열입니다. 이것은 나를 위해 작동합니다.

    그것은 오래된 주제이다하지만 난 뭔가를 발견했다. MySQL의 워크 벤치를 구축하는 동안, 그것은 또한 다른 테이블의 관계를 가져옵니다. 당신이 관련 기둥을 둡니다. 지우기 다른 자동으로 추가 열입니다. 이것은 나를 위해 작동합니다.

  28. ==============================

    28.내 경우에는 내가 언급 컬럼에 오타가 있다고했다 :

    내 경우에는 내가 언급 컬럼에 오타가 있다고했다 :

    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
    
  29. ==============================

    29.난 당신이 같은 다른 데이터 형식의 기본 키를 넣을 때 오류가 와서이 문제를 직면 :

    난 당신이 같은 다른 데이터 형식의 기본 키를 넣을 때 오류가 와서이 문제를 직면 :

    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 데이터 형식

  30. from https://stackoverflow.com/questions/8434518/mysql-foreign-key-constraint-is-incorrectly-formed-error by cc-by-sa and MIT license