无法创建外键mysql

时间:2018-01-09 21:55:08

标签: mysql sql foreign-keys unique-constraint

错误代码:1215:无法添加外键约束

我尝试了所有选项,例如使用

更改默认存储引擎
SET default_storage_engine=ENGINE

但我无法创建此外键约束。我正在使用Mysql 5.5。 任何人都可以帮助我。

create table if not exists pallets(
    palletId serial,
    goodsType varchar(25),
    desitination varchar(25),
    primary key (palletId)
);
create table if not exists storage(
    id serial,
    palletId integer,
    primary key (id),
    constraint FK _Pallet foreign key (palletId) REFERENCES pallets(palletId)
);

3 个答案:

答案 0 :(得分:2)

外键列的数据类型必须匹配引用表中引用的(通常是主键)列的数据类型。

当我们尝试创建违反此限制的外键约束时,错误1215是预期的行为。

根据MySQL参考手册https://dev.mysql.com/doc/refman/5.6/en/numeric-type-overview.html

SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的别名。

因此pallets的表定义等同于:

create table pallets
( palletId   BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
  --         ^^^^^^^^^^^^^^^  
, ...
, primary key (palletId)
);

外键引用需要具有相同的数据类型BIGINT UNSIGNED

e.g。

create table storage
( id ...
, palletId   BIGINT UNSIGNED 
  --         ^^^^^^^^^^^^^^^
, primary key (id)
, constraint FK_storage_pallets foreign key (palletId) REFERENCES pallets(palletId)
);

答案 1 :(得分:0)

之前已经在堆栈溢出中询问过此问题,您可能需要检查这些问题:Error Code: 1215. Cannot add foreign key constraint (foreign keys)

答案 2 :(得分:0)

如果您将SERIAL数据类型用作主键,则外键应为BIGINT UNSIGNED

create table if not exists pallets(
    palletId serial,
    goodsType varchar(25),
    desitination varchar(25),
    primary key (palletId)
);
create table if not exists storage(
    id serial,
    palletId bigint unsigned,
    primary key (id),
    constraint FK _Pallet foreign key (palletId) REFERENCES pallets(palletId)
);