为什么出现 ERROR 1005 (HY000): Can't create table (errno: 150)?

问题描述 投票:0回答:4
CREATE TABLE PRICING(
    CodeVillage INT,
    TypeCabin INT,
    CodeSeason CHAR(2),
    WeekPrice INT,
    PRIMARY KEY(CodeVillage, TypeCabin, CodeSeason)
);

CREATE TABLE SEASON(
    CodeSeason CHAR(2) PRIMARY KEY,
    NameSeason VARCHAR(20),
    CONSTRAINT Fk_Pricing_CodeSeason Foreign KEY (CodeSeason)
    REFERENCES PRICING(CodeSeason)
);
ERROR 1005 (HY000): Can't create table 'france.season' (errno: 150)

问题出在外键上,但为什么呢?

PRICING
里面没有数据。

sql mysql database foreign-keys constraints
4个回答
2
投票

外键建立 1:n 关系。父表有一个主键,因此每一行都是唯一可识别的。子表有一个外键引用该主键,从而表明子行属于哪一个父行。

您错误地尝试将外键放置在父表中。

CREATE TABLE season
(
    CodeSeason CHAR(2) PRIMARY KEY,
    NameSeason VARCHAR(20)
);

CREATE TABLE pricing
(
    CodeVillage INT,
    TypeCabin   INT,
    CodeSeason  CHAR(2),
    WeekPrice   INT,
    PRIMARY KEY(CodeVillage, TypeCabin, CodeSeason),
    CONSTRAINT Fk_CodeSeason FOREIGN KEY (CodeSeason) REFERENCES season (CodeSeason)
);

1
投票

由于错误并不是很详细,因此执行

SHOW ENGINE INNODB STATUS

相反,它可以让您在

LATEST FOREIGN KEY ERROR
部分了解更多详细信息:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2023-09-26 09:26:17 0x1910 Error in foreign key constraint of table `test_db`.`season`:
Create  table `test_db`.`season` with foreign key `Fk_Pricing_CodeSeason` constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns.

0
投票

实际上,您收到的错误消息已经暗示您需要为引用的列创建索引:无法在引用的表中找到索引,其中引用的列显示为第一列,或者表和引用中的列类型表与约束不匹配。 您不必更改代码,只需在尝试创建子表之前为父表中引用的列创建索引即可:

CREATE TABLE PRICING(
    CodeVillage INT,
    TypeCabin INT,
    CodeSeason CHAR(2),
    WeekPrice INT,
    PRIMARY KEY(CodeVillage, TypeCabin, CodeSeason)
);

create index idx_codeseason on PRICING(CodeSeason);

CREATE TABLE SEASON(
    CodeSeason CHAR(2) PRIMARY KEY,
    NameSeason VARCHAR(20),
    CONSTRAINT Fk_Pricing_CodeSeason Foreign KEY (CodeSeason)
    REFERENCES PRICING(CodeSeason)
);

0
投票

我在

Pricing
的定义部分之后添加了一个索引,并且它有效。

CREATE INDEX idx_CodeSeason ON PRICING (CodeSeason);

这是来自

LATEST FOREIGN KEY ERROR
部分的消息,根据这个答案
CodeSeason
位于主键的第三部分,SQL引擎需要基于第一个位置的索引或主键等。

© www.soinside.com 2019 - 2024. All rights reserved.