복붙노트

[SQL] MySQL은 : ERROR 1215 (HY000)는 : 외래 키 제약 조건을 추가 할 수 없습니다

SQL

MySQL은 : ERROR 1215 (HY000)는 : 외래 키 제약 조건을 추가 할 수 없습니다

나는 Silberschatz을 읽기 데이터베이스 시스템 개념, 6 버전을 가지고있다. 내가 MySQL을 OS X에 2 장에 나타난 대학 데이터베이스 시스템을 구현하는거야. 하지만 테이블 코스를 만들기와 문제가 있습니다. 테이블 부서 모습처럼

mysql> select * from department
    -> ;
+------------+----------+-----------+
| dept_name  | building | budget    |
+------------+----------+-----------+
| Biology    | Watson   |  90000.00 |
| Comp. Sci. | Taylor   | 100000.00 |
| Elec. Eng. | Taylor   |  85000.00 |
| Finance    | Painter  | 120000.00 |
| History    | Painter  |  50000.00 |
| Music      | Packard  |  80000.00 |
| Physics    | Watson   |  70000.00 |
+------------+----------+-----------+

mysql> show columns from department
    -> ;
+-----------+---------------+------+-----+---------+-------+
| Field     | Type          | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| dept_name | varchar(20)   | NO   | PRI |         |       |
| building  | varchar(15)   | YES  |     | NULL    |       |
| budget    | decimal(12,2) | YES  |     | NULL    |       |
+-----------+---------------+------+-----+---------+-------+

테이블 코스를 만드는 것은 다음과 같은 오류가 발생합니다.

mysql> create table course
    -> (course_id varchar(7),
    -> title varchar (50),
    -> dept_name varchar(20),
    -> credits numeric(2,0),
    -> primary key(course_id),
    -> foreign key (dept_name) references department);
ERROR 1215 (HY000): Cannot add foreign key constraint

외래 키 제약 조건에 대한 구글을 검색 한 후, 난 그냥 단어 '외래 키 제약 조건'테이블 부서에서 기본 키 컬럼에 존재해야 테이블 과정에서 외래 키 열에서 데이터를 나타내는 것을 배웠습니다. 데이터를 삽입 할 때이 오류를 충족해야한다.

그렇지 않다면, 왜 저자는 나에게 그 SQL 문을 실행할 수 있도록 하는가?

정말 잘못된 SQL 문을 실행하면합니까 나는 일부 데이터를 삽입 한 후 외부 키로 물론 테이블에 DEPT_NAME을 지정할 수 있나요?

편집 : 입력 세트 FOREIGN_KEY_CHECKS = MySQL의에 0> 오류를 수정하지 않습니다.

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2013-09-21 16:02:20 132cbe000 Error in foreign key constraint of table university/course:
foreign key (dept_name) references department):
Syntax error close to:
)
mysql> set foreign_key_checks=0
    -> ;
Query OK, 0 rows affected (0.00 sec)
mysql> create table course
    -> (course_id varchar(7),
    -> title varchar(50),
    -> dept_name varchar(20),
    -> credits numeric(2,0),
    -> primary key(course_id),
    -> foreign key (dept_name) references department);
ERROR 1215 (HY000): Cannot add foreign key constraint

해결법

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

    1.다음 CREATE TABLE을위한 FOREIGN KEY의 신택스 구성된다 :

    다음 CREATE TABLE을위한 FOREIGN KEY의 신택스 구성된다 :

    FOREIGN KEY (index_col_name)
            REFERENCES table_name (index_col_name,...)
    

    그래서 귀하의 MySQL의 DDL은해야합니다 :

     create table course (
            course_id varchar(7),
            title varchar(50),
            dept_name varchar(20),
            credits numeric(2 , 0 ),
            primary key (course_id),
            FOREIGN KEY (dept_name)
                REFERENCES department (dept_name)
        );
    

    또한, 부서 테이블 DEPT_NAME에 있어야 VARCHAR (20)

    자세한 정보는 MySQL의 문서에서 찾을 수 있습니다

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

    2.이 모호한 오류 메시지가 도착하면, 당신은 실행하여 자세한 오류를 찾을 수 있습니다

    이 모호한 오류 메시지가 도착하면, 당신은 실행하여 자세한 오류를 찾을 수 있습니다

    SHOW ENGINE INNODB STATUS;
    

    가장 일반적인 이유는 외래 키, 모두 참조 필드와 외래 키 필드 필요성을 만들 때하는 것이 일치한다는 것이다 :

    이 오류의 또 다른 원인은 다음과 같습니다 일부 열이 NOT NULL로 정의하지만 당신은 SET NULL의 조건을 정의했습니다.

  3. ==============================

    3.어쩌면 당신의 DEPT_NAME 열은 서로 다른 문자 집합을 가지고있다.

    어쩌면 당신의 DEPT_NAME 열은 서로 다른 문자 집합을 가지고있다.

    당신은 하나 또는 둘 다 변경을 시도 할 수 있습니다 :

    ALTER TABLE department MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
    ALTER TABLE course MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
    
  4. ==============================

    4.

    foreign key (dept_name) references department
    

    이 구문은 MySQL은 유효하지 않습니다. 대신해야한다 :

    foreign key (dept_name) references department(dept_name)
    

    MySQL은 두 번 사용할 수 DEPT_NAME이 필요합니다. 기본 열을 정의하면 일단은 외국 열을 정의하고 있습니다.

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

    5.외부 키가 자신의 테이블에서 기본 키가 아닌 경우이 오류를 얻을 수있다.

    외부 키가 자신의 테이블에서 기본 키가 아닌 경우이 오류를 얻을 수있다.

    나는 ALTER TABLE을했고, 실수로 열 기본 키 상태를 제거하고이 오류가 발생했습니다.

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

    6.당신이 오류가 있음도 주목할 필요가있을 때 명시 적으로 올바른 테이블의 컬럼과 일치하지 않는 다른 수의 외래 키 컬럼의 유형입니다.

    당신이 오류가 있음도 주목할 필요가있을 때 명시 적으로 올바른 테이블의 컬럼과 일치하지 않는 다른 수의 외래 키 컬럼의 유형입니다.

    예를 들면 :

    alter table schoolPersons
             add index FKEF5AB5E532C8FBFA (student_id),
             add constraint FKEF5AB5E532C8FBFA
             foreign key (student_id)
             references student (id);
    ERROR 1215 (HY000): Cannot add foreign key constraint
    

    student_id 필드는 다음과 같이 정의 되었기 때문이었다 :

    mysql> desc schoolPersons;
    +--------------------+------------+------+-----+---------+----------------+
    | Field              | Type       | Null | Key | Default | Extra          |
    +--------------------+------------+------+-----+---------+----------------+
    | student_id         | bigint(20) | YES  |     | NULL    |                |
    

    반면 학생 테이블의 id 필드는 다음과 같이 정의 하였다 :

    mysql> desc persons;
    +--------------+----------------------+------+-----+-------------------+-----------------+
    | Field        | Type                 | Null | Key | Default           | Extra           |
    +--------------+----------------------+------+-----+-------------------+-----------------+
    | id           | int(10) unsigned     | NO   | PRI | NULL              | auto_increment  |
    

    (긴 최대 절전 모드에서 자바에서 생성)을 BIGINT (20)와 호환되지 않습니다 INT (10) 부호 (자바 INT).

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

    7.그냥 외국 제약 조건 '서명'추가

    그냥 외국 제약 조건 '서명'추가

    `FK` int(11) unsigned DEFAULT NULL,
    
  8. ==============================

    8.열 유형이 CHAR 또는 VARCHAR 인 경우 두 테이블의 캐릭터 세트를 확인합니다. 나는 문자 집합 = GBK를 사용하지만, 나는 누구의 기본 문자 집합 = UTF8 새 테이블을 만들 수 있습니다. 그래서 캐릭터 세트는 동일하지 않습니다.

    열 유형이 CHAR 또는 VARCHAR 인 경우 두 테이블의 캐릭터 세트를 확인합니다. 나는 문자 집합 = GBK를 사용하지만, 나는 누구의 기본 문자 집합 = UTF8 새 테이블을 만들 수 있습니다. 그래서 캐릭터 세트는 동일하지 않습니다.

    ERROR 1215 (HY000): Cannot add foreign key constraint
    

    이 같은 캐릭터 세트를 사용하는 것입니다 해결합니다. 예를 들어 UTF8하십시오.

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

    9.다음 코드는 나를 위해 일한

    다음 코드는 나를 위해 일한

    set @@foreign_key_checks=0;
    ALTER TABLE  `table1` ADD CONSTRAINT `table1_fk1` FOREIGN KEY (`coloumn`) REFERENCES `table2` (`id`) ON DELETE CASCADE;
    
  10. ==============================

    10.당신이 참조 부분에 사용하고있는 대상 테이블 또는 열이 단순히 존재하지 않는 경우에도이 오류가 발생할 수 있다는 지적이의 가치.

    당신이 참조 부분에 사용하고있는 대상 테이블 또는 열이 단순히 존재하지 않는 경우에도이 오류가 발생할 수 있다는 지적이의 가치.

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

    11.나는 누군가가 명시 적으로 알리는 표시되지 않습니다와 나는이 같은 오류 메시지가 있었고, 내 문제는 내가 임시 테이블에 외부 키를 추가하려고 한 것이 었습니다. 설명서에 언급 한 바와 같이 어떤 허용되지 않습니다

    나는 누군가가 명시 적으로 알리는 표시되지 않습니다와 나는이 같은 오류 메시지가 있었고, 내 문제는 내가 임시 테이블에 외부 키를 추가하려고 한 것이 었습니다. 설명서에 언급 한 바와 같이 어떤 허용되지 않습니다

    (강조 광산)

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

    12.나뿐만 아니라 동일한 문제를 건너 왔어요. 확실하지 왜 작동이 있지만 실제로 작동합니다 : 당신 조회 작성 후 ENGINE INNODB를 추가하십시오.

    나뿐만 아니라 동일한 문제를 건너 왔어요. 확실하지 왜 작동이 있지만 실제로 작동합니다 : 당신 조회 작성 후 ENGINE INNODB를 추가하십시오.

    mysql> create table course
    -> (course_id varchar(7),
    -> title varchar (50),
    -> dept_name varchar(20),
    -> credits numeric(2,0),
    -> primary key(course_id),
    -> foreign key (dept_name) references department) ENGINE INNODB;
    
  13. ==============================

    13.이 직접 상황에 정확하게 연결되지 않은 경우에도, 당신이 데이터베이스 테이블을 작성하는 순서를 존중하지 않는 경우가 mstatus 이노 쇼 엔진을 입력 할 때 정확히 같은 오류 출력을 얻을 수 있습니다에 더 독자들에게 도움이 될 수 있습니다; 아직 존재하지 않는 테이블을 참조하는 외국의 제약 조건을 추가하지 않아야 의미한다. 참조 테이블은 이전에를 가리키는 테이블에 존재해야합니다.

    이 직접 상황에 정확하게 연결되지 않은 경우에도, 당신이 데이터베이스 테이블을 작성하는 순서를 존중하지 않는 경우가 mstatus 이노 쇼 엔진을 입력 할 때 정확히 같은 오류 출력을 얻을 수 있습니다에 더 독자들에게 도움이 될 수 있습니다; 아직 존재하지 않는 테이블을 참조하는 외국의 제약 조건을 추가하지 않아야 의미한다. 참조 테이블은 이전에를 가리키는 테이블에 존재해야합니다.

    테이블 생성 순서는 외래 키 제약 조건에 포함 된 열을 존중하지만하지 않는 경우에도 마찬가지입니다.

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

    14.내 경우 캐릭터 세트에서, 데이터 타입 모든 것은 정확했다. 조사 후 나는 부모 테이블에서 외래 키 컬럼에 인덱스가 없다는 것을 발견했다. 추가되면 문제가 해결되었다.

    내 경우 캐릭터 세트에서, 데이터 타입 모든 것은 정확했다. 조사 후 나는 부모 테이블에서 외래 키 컬럼에 인덱스가 없다는 것을 발견했다. 추가되면 문제가 해결되었다.

  15. ==============================

    15.

    CONSTRAINT vendor_tbfk_1 FOREIGN KEY (V_CODE) REFERENCES vendor (V_CODE) ON UPDATE CASCADE
    

    이 ...이 될 수있는 방법을 참조하는 열 부분에서 모습이다. (V_code)

  16. from https://stackoverflow.com/questions/18930084/mysql-error-1215-hy000-cannot-add-foreign-key-constraint by cc-by-sa and MIT license