4

怎么了?

mysql> create table price(
    -> p_code char(1) not null,
    -> p_description varchar(20),
    -> p_rentfee decimal(2,2) not null,
    -> p_dylatefee decimal(2,2));
Query OK, 0 rows affected (0.18 sec)

mysql> create table movie(
    -> mv_no char(4) not null,
    -> mv_name varchar(50) not null,
    -> mv_year char(4) not null,
    -> mv_cost decimal(2,2) not null,
    -> mv_genre varchar(15) not null,
    -> p_code char(1) not null,
    -> foreign key (p_code) references price(p_code));
ERROR 1215 (HY000): Cannot add foreign key constraint

mysql>
4

6 回答 6

7

price.p_code不是 的主键price。尝试:

create table price(
p_code char(1) not null PRIMARY KEY,
p_description varchar(20),
p_rentfee decimal(2,2) not null,
p_dylatefee decimal(2,2));

一般来说,外键必须引用一个主键/唯一键、一个完整的主键/唯一键,并且只能引用一个主键/唯一键。

在某些 RDBMS 中,例如 SQL Server,您可以引用具有唯一索引(不是键)的列(请参阅我们可以在任何其他表中拥有一个不是主键的外键吗?),但这是非标准行为.

于 2013-04-05T19:39:49.217 回答
7
  • 引擎应该是相同的,例如 InnoDB
  • 数据类型应该相同,并且具有相同的长度。例如 VARCHAR(20)
  • Collat​​ion Columns 字符集应该相同。例如 utf8
    Watchout:即使您的表有相同的排序规则,列仍然可能有不同的排序规则。
  • 唯一- 外键应指被引用表中唯一的字段(通常是主键)。
于 2016-01-25T11:29:18.447 回答
2

p_code应该是price表中的主键:

create table price(
-> p_code char(1) not null,
-> p_description varchar(20),
-> p_rentfee decimal(2,2) not null,
-> p_dylatefee decimal(2,2),
-> PRIMARY KEY ( p_code ));
于 2013-04-05T19:40:05.810 回答
0
  1. 引用的列price.p_code必须是唯一的(需要创建主键或唯一键)。
  2. 两个表都必须是InnoDb表,ENGINE = INNODBCREATE TABLE语句中使用。
于 2013-04-05T20:10:06.697 回答
0

p_code设置为键,将其设置为唯一键主键

于 2013-04-05T19:49:44.327 回答
0

子列的数据类型必须与父列完全匹配。例如,由于 price.p_code 是 char(1),movie.p_code 也需要是 char(1),price.p_code 需要是主键或需要创建索引。

于 2016-08-31T13:09:06.260 回答