MySQL : ERROR 1215 (HY000) :외부 키 제약 조건을 추가할 수 없습니다.
Silberschatz 제6판 데이터베이스 시스템 개념을 읽었습니다.OS X의 2장에 나와 있는 대학 데이터베이스 시스템을 MySQL에 구현합니다.하지만 테이블을 만드는 데 문제가 있습니다.course
테이블department
처럼 보인다
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 | |
+-----------+---------------+------+-----+---------+-------+
테이블의 작성course
는 다음 오류를 일으킵니다.
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
구글에서 외부 키 제약 조건을 검색한 후, 나는 '외부 키 제약'이라는 단어가 테이블의 외부 키 열의 데이터를 나타낸다는 것을 방금 알았다.course
테이블의 기본 키 열에 있어야 합니다.department
하지만 데이터를 삽입할 때 이 오류가 발생했어야 했습니다.
그렇지 않으면 왜 작성자가 SQL 문을 실행하도록 지시합니까?
만약 내가 정말로 잘못된 SQL 문을 실행한다면,dept_name
데이터를 삽입한 후 외부 키로 코스 테이블에 저장합니까?
편집 : 입력set foreign_key_checks=0
안으로mysql>
에러는 수정되지 않습니다.
------------------------
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
이 애매한 에러 메세지가 표시되는 경우는, 를 실행하고, 보다 구체적인 에러를 확인할 수 있습니다.
SHOW ENGINE INNODB STATUS;
가장 일반적인 이유는 외부 키를 작성할 때 참조필드와 외부 키필드가 모두 일치해야 하기 때문입니다.
- 엔진은 동일해야 합니다(예: InnoDB
- 데이터 유형은 동일하고 길이가 같아야 합니다.
예: VARCHAR(20) 또는 INT(10) UNSIGNARED - 대조는 동일해야 합니다(예: utf8).
- [Unique] : [ Foreign Key ] unique 、 [ Reference Table ](일반적으로 개인)의 필드를 참조해야 합니다.
이 에러의 다른 원인은 다음과 같습니다.
일부 열이 NOT NULL로 정의되어 있지만 SET NULL 조건을 정의했습니다.
의 구문FOREIGN KEY
위해서CREATE TABLE
는 다음과 같이 구성되어 있습니다.
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)
);
또,department
테이블dept_name
그래야 한다VARCHAR(20)
아마도 당신의dept_name
열의 문자 집합이 다릅니다.
둘 중 하나 또는 둘 다 변경할 수 있습니다.
ALTER TABLE department MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
ALTER TABLE course MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
foreign key (dept_name) references department
이 구문은 MySQL에 유효하지 않습니다.대신 다음과 같이 해야 합니다.
foreign key (dept_name) references department(dept_name)
MySQL을 두 번 사용해야 합니다.외부 열을 정의하려면 한 번, 기본 열을 정의하려면 한 번입니다.
13.1.17.2.FORNE KEY 제약사항 사용
... [ ] 외부 키 제약 정의의 필수 구문
CREATE TABLE
또는ALTER TABLE
스테이트먼트는 다음과 같습니다.[CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION
외부 키가 테이블 내의 프라이머리 키가 아닌 경우에도 이 오류가 발생할 수 있습니다.
ALTER TABLE을 했는데 실수로 컬럼의 프라이머리 키 상태를 삭제하여 이 오류가 발생하였습니다.
ERROR 1215 (HY000):외부 키 제약 조건을 추가할 수 없습니다.
또한 다른 기능에서 외부 키인 열의 유형이 올바른 표의 열과 명시적으로 일치하지 않는 경우에도 이 오류가 발생한다는 점에 유의하십시오.
예를 들어 다음과 같습니다.
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
의 student
테이블은 다음과 같이 정의되었습니다.
mysql> desc persons;
+--------------+----------------------+------+-----+-------------------+-----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------------+------+-----+-------------------+-----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
bigint(20)
(Java)에서)long
hibernate는 호환성이 .int(10) unsigned
(Java)int
를 참조해 주세요.
나는 너처럼 그 문제를 해결하지 못한다.같은 에러 메세지가 표시됩니다.그래서 다른 사람들의 편의를 위해 여기에 표시해 두었습니다.
이 열음음음음음음음음음음음음음 is is is is is is is is the the the the is the the인 경우 두 표의 문자 합니다.char
★★★★★★★★★★★★★★★★★」varchar
사용하고 있습니다.charset=gbk
, 디폴트 은 「 」로 있습니다.을 사용하다charset=utf8
문자 집합이 동일하지 않습니다.
ERROR 1215 (HY000): Cannot add foreign key constraint
이 문제를 해결하려면 같은 문자 집합을 사용해야 합니다.를 들어, 「」입니다.utf8
.
FORENAL 제약 조건에 대해 '서명되지 않음'만 추가하십시오.
`FK` int(11) unsigned DEFAULT NULL,
이 오류는 REFERENCE 부분에서 사용하는 대상 테이블 또는 열이 존재하지 않는 경우에도 발생할 수 있습니다.
아래 코드가 나에게 효과가 있었다.
set @@foreign_key_checks=0;
ALTER TABLE `table1` ADD CONSTRAINT `table1_fk1` FOREIGN KEY (`coloumn`) REFERENCES `table2` (`id`) ON DELETE CASCADE;
내 경우 부모 테이블과 자식 테이블 간에 엔진이 다릅니다.엔진을 동등하게 만드는 것은 효과가 있습니다.
문제: 부모 테이블 'engine' => 'MyISAM', 하위 테이블 '엔진' => 'innoDB',
Corresao: 부모 테이블 '엔진' => '마이'ISAM', 하위 테이블 '엔진' => '내'ISAM',
명시적으로 말하는 사람은 없고, 같은 에러 메세지가 표시되고 있어, TEMPORY 테이블에 외부 키를 추가하려고 하는 것이 문제였습니다.매뉴얼에 기재된 바와 같이 허용되지 않습니다.
외부 키 관계에는 중앙 데이터 값을 유지하는 상위 테이블과 부모를 가리키는 동일한 값을 가진 하위 테이블이 포함됩니다.FORENAL KEY 절이 하위 테이블에 지정됩니다.상위 테이블과 하위 테이블은 동일한 스토리지 엔진을 사용해야 합니다.임시 테이블이 아니어야 합니다.
(내 것을 제외)
저도 같은 문제에 부딪혔어요.이 기능이 작동하는 이유는 확실하지 않지만 실제로 작동합니다.작성 쿼리 후 엔진 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;
라도, 「」를 입력하면, 수 .show engine innodb mstatus
데이터베이스 테이블 작성 순서를 따르지 않는 경우, 즉 아직 존재하지 않는 테이블을 참조하는 외부 제약 조건을 추가할 수 없습니다.참조 테이블은 참조 테이블을 가리키는 테이블보다 먼저 존재해야 합니다.
이는 테이블 작성 순서가 존중되지만 외부 키 제약에 관련된 열은 존중되지 않는 경우에도 해당됩니다.
제 경우엔 데이터 입력이 모두 맞았습니다.조사 결과 부모 테이블에는 외부 키 열에 인덱스가 없는 것으로 나타났습니다.추가된 문제가 해결되었습니다.
(Mysql Workbench에서) PhpAdminMy에서 Import하려고 했을 때 이 오류가 발생하였습니다.SQL 내보내기확인 결과, 다음과 같은 방법으로 고유 키와 외부 키를 비활성화했습니다.
SET unique_checks=0;
SET foreign_key_checks = 0;
같은 에러가 아직 표시된다(MySQL : ERROR 1215 (HY000):외부 키 제약 조건을 추가할 수 없습니다).이 create 문에서 오류가 발생했습니다.
DROP TABLE IF EXISTS `f1_pool`;
CREATE TABLE `f1_pool` (
`id` int(11) NOT NULL,
`name` varchar(45) NOT NULL,
`description` varchar(45) DEFAULT NULL COMMENT 'Optional',
`ownerId` int(11) NOT NULL,
`lastmodified` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
외래 키나 고유 인덱스가 없는데, 뭐가 문제죠?결국(90분 동안 혼란스러웠던 후) MySQL을 재시작하고 한 번의 수정으로 Import를 다시 수행하기로 결정했습니다.가져오기 전에 모든 테이블을 삭제했습니다.오류는 없었고, 모두 작동했으며 테이블과 뷰가 복원되었습니다.따라서 모든 것이 정상이라면 먼저 MySQL을 재시작해 보십시오!
여러 가지가 있을 수 있습니다.
제 경우 테이블/필드 대조였습니다.
- 대상: FK 상::
CHARSET=utf8 COLLATE=utf8_unicode_ci
- 필드: FK "FK " " :
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
CONSTRAINT vendor_tbfk_1 FOREIGN KEY (V_CODE) REFERENCES vendor (V_CODE) ON UPDATE CASCADE
이렇게 될 수 있어요참조 컬럼 부분을 확인합니다.(V_code)
언급URL : https://stackoverflow.com/questions/18930084/mysql-error-1215-hy000-cannot-add-foreign-key-constraint
'programing' 카테고리의 다른 글
레일: 데이터베이스의 빈 문자열을 NULL로 강제 적용합니다. (0) | 2022.11.21 |
---|---|
창을 삭제하는 방법.Nuxt의 Vuex에서 문제없이 __NUXT__ (0) | 2022.11.21 |
Vuejs 및 Vuex 어레이에 무선 입력 값만 입력하는 방법 (0) | 2022.11.21 |
파라미터가 다른 여러 메서드콜을 확인하는 방법 (0) | 2022.11.21 |
조인에서 모든 열 이름 앞에 열 이름의 원본 테이블을 붙이는 방법 (0) | 2022.11.21 |