2016-05-03 12 views
0

Ich bin neu bei SQL.mysql - kann keine Fremdschlüsseleinschränkung beim Erstellen einer Tabelle hinzufügen

Ich bekomme diese Fehlermeldung, wenn ich versuche Fremdschlüssel zu erstellen:

cannot add foreign key constraint 

, wenn ich versuche, die ORDERS-Tabelle zu erstellen. hier ist mein Code:

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) 
); 

ich die ORDERS setzen (wo ich das Problem haben) auf verschiedenen Linien zu erleichtern Ihnen zu lesen.

Ich suche hier nach einer Antwort, aber habe nichts bestimmtes gefunden, das meine Frage beantwortet.

hat jemand eine Idee, was das Problem ist? Danke!

+0

Wenn Sie einen Fremdschlüssel zu erstellen, muss die referenzierte Spalte ein Primärschlüssel (oder zumindest ein eindeutiger Schlüssel abhängig von der SQL sein, die Sie verwenden). Dies ist bei Ihrer Workers-Tabelle nicht der Fall. –

Antwort

1

Das Problem ist, dass Sie eine FOREIGN KEY Beziehung zu einem Feld in den WORKERS und CUSTOMERS Tabellen zu erstellen versuchen, die nicht eingestellt werden als PRIMARY KEY auf.

Die FOREIGN KEY muss auf eine PRIMARY KEY zeigen. Ändern Sie Ihr Erstellungsscript wie folgt:

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); 

Ein Wort der Vorsicht, obwohl. Ich würde empfehlen, VARCHAR (4) nicht als PRIMARY KEY Feld zu verwenden. Ich würde stattdessen eine INT AUTO_INCREMENT empfehlen.

+0

vielen Dank! und ja, ich stimme dir zu, es ist besser, auto_increment zu sein - aber meine Schule will, dass es so ist ... Ich bin mir nicht wirklich sicher warum. – moshem

+1

Fremdschlüssel muss nicht auf einen Primärschlüssel zeigen, es muss nur eine indizierte Spalte sein. – Barmar

1

Die Spalte der referenzierten Tabelle sollte als primary key deklariert werden, um einen Fremdschlüssel zuzuweisen. Für Ihre orders Tabelle, WORKERS(w_id) und CUSTOMERS(customer_id) sind nicht als Primärschlüssel deklariert, daher erhalten Sie den Fehler.

Modified Statements:

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

Die referenzierte Spalte muss nur einen Index haben, sie muss kein Primärschlüssel sein, obwohl dies normalerweise der Fall ist. – Barmar

Verwandte Themen