mysql - 创建表时无法添加外键约束

时间:2016-05-03 14:26:55

标签: mysql sql foreign-keys foreign-key-relationship

我是sql的新手。

当我尝试创建外键时出现此错误:

cannot add foreign key constraint

当我尝试创建ORDERS表时。这是我的代码:

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(我有问题的地方)放在不同的行上,以便你阅读。

我在这里搜索答案,但没有找到任何能回答我问题的具体内容。

任何人都知道问题是什么?谢谢!

2 个答案:

答案 0 :(得分:1)

问题是,您尝试与FOREIGN KEYWORKERS表格中未设置为CUSTOMERS的字段创建PRIMARY 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

答案 1 :(得分: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