为什么这样建不了表?

问题描述 投票:0回答:3

我有一组sql语句,

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)
);

sql 给了我提示

ERROR 1005 (HY000): Can't create table 'france.season' (errno: 150)

我知道问题出在外键上,但我不知道为什么,你能帮我弄清楚吗?这只是创建问题,表定价没有数据。

sql mysql database foreign-keys constraints
3个回答
0
投票

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

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
投票

外键建立 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)
);

0
投票

我认为问题在于,您无法在引用

CodeSeason
表中的
SEASON
列的
CodeSeason
表中的
PRICING
列上创建外键约束,因为
CodeSeason 中的 
PRICING
 
表与其他列一起是复合主键的一部分。仅当目标表中引用的列形成唯一键时,才能创建外键约束。由于
CodeSeason
本身并不唯一,因此您会收到错误。

您应该能够修改外键约束以引用

PRICING
表中的整个复合键:

CONSTRAINT Fk_Pricing_CodeSeason FOREIGN KEY (CodeVillage, TypeCabin, CodeSeason)
REFERENCES PRICING(CodeVillage, TypeCabin, CodeSeason);
© www.soinside.com 2019 - 2024. All rights reserved.