2013-11-23 5 views
10

시스템의 데이터베이스와 테이블을 구축하려고합니다. 하지만 코드에 외래 키를 추가하지 않으면 발견했습니다. 오류가 없습니다. 나는 코드를 작동 시키려고 많은 방법을 사용해 왔지만 여전히 오류가있다.MySQL 외래 키, 테이블을 생성 할 수 없습니다 (errno : 150)

저는 MySQL 5.5.31을 사용하고 있으며, 코드는 다음과 같습니다 : CREATE DATABASE TOS;

DROP TABLE TOS.USER CASCADE; 
DROP TABLE TOS.BILL_HEADER CASCADE; 
DROP TABLE TOS.TOY CASCADE; 


CREATE TABLE TOS.USER 
(User Char(8), 
Name Char(10), 
Type Char(1), 
Password Char(12), 
PRIMARY KEY(User)); 

CREATE TABLE TOS.BILL_HEADER 
(Bill_No Char(10), 
CTime DateTime, 
No_Of INTEGER, 
Cus_No Char(5), 
DTime DateTime, 
PRIMARY KEY(Bill_No)); 

CREATE TABLE TOS.TOY 
(Toy_Id Char(10), 
FullN Char(50), 
ShortN Char(20), 
Descrip Char(20), 
Price DECIMAL, 
Avail Char(1), 
Cat Char(1), 
PRIMARY KEY(Toy_Id)); 

CREATE TABLE TOS.BILL_ITEM 
(Bill_No Char(10), 
BSeq_No INTEGER, 
Toy_Id Char(10), 
OTime DateTime, 
Quan INT, 
DCondition Char(1), 
PRIMARY KEY(Bill_No,BSeq_No), 
FOREIGN KEY(Bill_No) REFERENCES TOS.Bill_Header(Bill_No), 
FOREIGN KEY(Toy_Id) REFERENCES TOS.TOY(Toy_Id)); 

오류 :

1005 - Can't create table 'TOS.BILL_ITEM' (errno: 150)

어떤 도움을 크게 감상 할 수있다.

+0

'DROP' 문을 제거하면 작동하는 것처럼 보입니다. http://sqlfiddle.com/#!2/08d1e –

+2

일반적으로 오류 150은 데이터 유형과 길이가 일치하지 않아 외래 키 오류입니다 열과 관계 사이 또는 기본 열의 누락 된 색인 당신은 올바른 타입과 PK 인덱스를 모두 정의했습니다. –

+0

문제를 좁히기 위해 외래 키 중 하나만 제거하려고 할 수 있습니까? –

답변

17

비 설명 오류 150은 일반적으로 외래 키 데이터 형식 또는 길이 불일치 또는 부모 테이블의 열에 누락 된 인덱스와 관련이 있습니다.

테이블 이름이 Bill_Header 인 대소 문자를 구분해야합니다 (BILL_HEADER이어야 함). From the MySQL docs on identifier case sensitivity:

In MySQL, databases correspond to directories within the data directory. Each table within a database corresponds to at least one file within the database directory (and possibly more, depending on the storage engine). Consequently, the case sensitivity of the underlying operating system plays a part in the case sensitivity of database and table names. This means database and table names are not case sensitive in Windows, and case sensitive in most varieties of Unix.


이 사건을 해결하고 작동합니다 :

CREATE TABLE TOS.BILL_ITEM 
(Bill_No Char(10), 
BSeq_No INTEGER, 
Toy_Id Char(10), 
OTime DateTime, 
Quan INT, 
DCondition Char(1), 
PRIMARY KEY(Bill_No,BSeq_No), 
FOREIGN KEY(Bill_No) REFERENCES TOS.BILL_HEADER(Bill_No), 
# Here-----------------------------^^^^^^^^^^^^^^ 
FOREIGN KEY(Toy_Id) REFERENCES TOS.TOY(Toy_Id)); 

SQLFiddle.com에서와 같이 코드가 작동하기 때문에 (http://sqlfiddle.com/#!2/08d1e) 기본이되는 플랫폼은 대소 문자를 구별이있을 수 없습니다.

+0

감사합니다. 작동합니다! 고맙습니다. – Confucius

+3

필자의 경우 부모 테이블과 자식 테이블간에 필드 콜레이트 불일치가있었습니다. – Serge

+1

또 다른 미묘한 문제는 문자 집합이 일치해야한다는 것입니다. 방금 참조한 테이블이 utf8 이었지만 latin-1 테이블에 대한 새로운 제약 조건을 만들려고했습니다. 일단 create table에서 ut8을 지정하면 모든 것이 잘되었다. – Felix

5

위의 답변은 정확하지만 외래 키가 참조하는 테이블이 innoDB 대신 MyISAM 인 경우에도이 오류가 발생할 수 있습니다.

+0

또는 상위 테이블에 DEFAULT CHARSET이 지정되어 있고 하위 테이블에 지정되지 않았거나 다른 DEFAULT CHARSET이 지정되어있는 경우. –