2016-05-03 52 views
0

私はSQLを初めて使用しました。私はORDERSテーブルを作成しようとしていたときにmysql - テーブルの作成時に外部キー制約を追加できません

cannot add foreign key constraint 

:私は外部キーを作成しようとすると

は、私はこのエラーを取得します。ここに私のコードは次のとおりです。

drop database if exists Company; 
create database Company; 
use Company; 
create table WORKERS(w_id varchar(4), w_name varchar(20) not null, telephone varchar(12), e_mail varchar(35) unique); 
create table CUSTOMERS(customer_id varchar(4), customer_name varchar(20) not null, telephone varchar(12), e_mail varchar(35) unique, credit bool); 
create table WAREHOUSE(m_id int unsigned primary key, describes varchar(20) not null, fl char(1)); 
create table ITEM(p_id int(4) unsigned primary key, p_name varchar(15) not null, p_price float not null); 
create table INVENTORY(in_id int auto_increment primary key, m_id int unsigned not null, p_id int(4) unsigned not null, amount int not null, 
foreign key (m_id) references WAREHOUSE(m_id), 
foreign key (p_id) references ITEM(p_id) 
); 
create table ORDERS(o_id int auto_increment primary key, customer_id varchar(4), 
p_id int(4) unsigned, w_id varchar(4), amount int unsigned not null, 
date_of_order date not null, 
foreign key (p_id) references ITEM(p_id), 
foreign key (w_id) references WORKERS(w_id), 
foreign key (customer_id) references CUSTOMERS(customer_id) 
); 

私が読んで、あなたにそれを容易にするために別の行に(私は問題を抱えている)ORDERSを置きます。

私はここで答えを探していますが、私の質問に答えたものは何も見つかりませんでした。

誰でも問題が何であるか知っていますか?ありがとうございました!

+0

外部キーを作成する場合、参照列が主キー(または使用しているSQLに応じて、少なくとも固有のキーである必要があります)。それはあなたの労働者テーブルの場合ではありません。 –

答えて

1

問題は、あなたがPRIMARY KEYとして設定されていないWORKERSCUSTOMERSテーブル内のフィールドにFOREIGN KEY関係を作成しようとしているということです。

FOREIGN KEYは、PRIMARY KEYを指す必要があります。作成スクリプトを次のように変更してください。

create table WORKERS(w_id varchar(4) primary key, w_name varchar(20) not null, telephone varchar(12), e_mail varchar(35) unique); 
create table CUSTOMERS(customer_id varchar(4) primary key, customer_name varchar(20) not null, telephone varchar(12), e_mail varchar(35) unique, credit bool); 

ただし、注意してください。私はVARCHAR (4)PRIMARY KEYフィールドとして使用しないことをお勧めします。代わりにINT AUTO_INCREMENTを使用することをおすすめします。

+0

ありがとう!はい、私はあなたに同意しますauto_incrementであることが良いですが、私の学校はそれがそうしたいと思っています...私は本当に理由は分かりません。 – moshem

+1

外部キーはプライマリキーを指す必要はなく、インデックス付きの列である必要があります。 – Barmar

1

外部キーを割り当てるには、参照先テーブルの列をprimary keyと宣言する必要があります。 ordersテーブルの場合、WORKERS(w_id)CUSTOMERS(customer_id)はプライマリキーとして宣言されていないため、エラーが発生します。

修正文:

drop database if exists Company; 
create database Company; 
use Company; 
create table WORKERS(w_id varchar(4) primary key, w_name varchar(20) not null, telephone varchar(12), e_mail varchar(35) unique); 
create table CUSTOMERS(customer_id varchar(4) primary key, customer_name varchar(20) not null, telephone varchar(12), e_mail varchar(35) unique, credit bool); 
create table WAREHOUSE(m_id int unsigned primary key, describes varchar(20) not null, fl char(1)); 
create table ITEM(p_id int(4) unsigned primary key, p_name varchar(15) not null, p_price float not null); 
create table INVENTORY(in_id int auto_increment primary key, m_id int unsigned not null, p_id int(4) unsigned not null, amount int not null, 
foreign key (m_id) references WAREHOUSE(m_id), 
foreign key (p_id) references ITEM(p_id) 
); 

create table ORDERS(o_id int auto_increment primary key, customer_id varchar(4), 
p_id int(4) unsigned, w_id varchar(4), amount int unsigned not null, 
date_of_order date not null, 
foreign key (p_id) references ITEM(p_id), 
foreign key (w_id) references WORKERS(w_id), 
foreign key (customer_id) references CUSTOMERS(customer_id) 
); 

SQLFiddle Demo

+0

参照される列には索引が必要ですが、通常はそうではありますが、主キーである必要はありません。 – Barmar

関連する問題