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
里面没有数据。
外键建立 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)
);
由于错误并不是很详细,因此执行
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.
实际上,您收到的错误消息已经暗示您需要为引用的列创建索引:无法在引用的表中找到索引,其中引用的列显示为第一列,或者表和引用中的列类型表与约束不匹配。 您不必更改代码,只需在尝试创建子表之前为父表中引用的列创建索引即可:
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)
);
我在
Pricing
的定义部分之后添加了一个索引,并且它有效。
CREATE INDEX idx_CodeSeason ON PRICING (CodeSeason);
这是来自
LATEST FOREIGN KEY ERROR
部分的消息,根据这个答案。 CodeSeason
位于主键的第三部分,SQL引擎需要基于第一个位置的索引或主键等。