我有一组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)
我知道问题出在外键上,但我不知道为什么,你能帮我弄清楚吗?这只是创建问题,表定价没有数据。
由于错误并不是很详细,因此执行
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.
外键建立 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)
);
我认为问题在于,您无法在引用
CodeSeason
表中的 SEASON
列的 CodeSeason
表中的 PRICING
列上创建外键约束,因为 CodeSeason
中的
PRICING
表与其他列一起是复合主键的一部分。仅当目标表中引用的列形成唯一键时,才能创建外键约束。由于
CodeSeason
本身并不唯一,因此您会收到错误。
您应该能够修改外键约束以引用
PRICING
表中的整个复合键:
CONSTRAINT Fk_Pricing_CodeSeason FOREIGN KEY (CodeVillage, TypeCabin, CodeSeason)
REFERENCES PRICING(CodeVillage, TypeCabin, CodeSeason);