为什么外键让我头疼?
首先,我创建了数据库名称colorcode
,然后paper
表,工作正常:
CREATE TABLE paper (
paper_id int(20) NOT NULL,
description VARCHAR(40) NOT NULL,
paper_color VARCHAR(40) NOT NULL,
PRIMARY KEY (paper_id, paper_color)
) ENGINE=InnoDB;
然后brick
表
CREATE TABLE brick(
brick_id int(20) NOT NULL,
description varchar(40) NOT NULL,
brick_color varchar (40) NOT NULL,
PRIMARY KEY (brick_id),
FOREIGN KEY (brick_color) REFERENCES paper(paper_color)
) ENGINE=InnoDB;
不是=>
#1005 - Can't create table 'colorcode.brick' (errno: 150)
谢谢你的帮助
答案 0 :(得分:1)
create table paper (
paper_id int(20) not null,
description VARCHAR(40)not null,
paper_color VARCHAR(40) NOT NULL,
primary key (paper_id, paper_color),
INDEX(`paper_color`)
)engine=InnoDB;
create table brick (
brick_id int(20) not null,
description varchar(40) not null,
brick_color varchar (40) not null,
primary key (brick_id),
CONSTRAINT foreign key (`brick_color`) REFERENCES paper(`paper_color`)
)engine=InnoDB;
演示:http://sqlfiddle.com/#!2/316d9
InnoDB允许外键引用任何索引列或组 列。但是,在引用的表中,必须有一个索引 其中引用的列被列为的第一列 同样的顺序。
http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
“paper_color”必须是一个索引才能引用。
希望这有帮助。
答案 1 :(得分:0)
一个表中的FOREIGN KEY指向另一个表中的PRIMARY KEY。
现在从您的脚本中,表纸上的PRIMARY KEY由paper_id,paper_color列组成,但引用它的外键,仅引用纸张(paper_color)
这技术上允许你有两个条目
paper_id paper_color
1 blue
2 blue
它将满足表格纸张的主键约束,但不满足表格砖上的外键约束
将表纸上的主键更改为paper_color会起作用。
create table paper (
paper_id int(20) not null,
description VARCHAR(40)not null,
paper_color VARCHAR(40) NOT NULL,
primary key ( paper_color)
)engine=InnoDB;
create table brick(
brick_id int(20) not null,
description varchar(40) not null,
brick_color varchar (40) not null,
primary key (brick_id),
foreign key (brick_color) references paper(paper_color)
)engine=InnoDB
答案 2 :(得分:0)
为paper_color
创建一个单独的密钥,它将起作用:
CREATE TABLE paper (
paper_id int(20) not null,
description VARCHAR(40)not null,
paper_color VARCHAR(40) NOT NULL,
PRIMARY KEY (paper_id, paper_color),
KEY (paper_color)
) ENGINE=InnoDB;