mysql - 外键约束格式不正确
问题描述
我遇到了一个问题,我无法创建一些表,因为它们的外键“格式不正确”。我不知道为什么会出现此错误,因为键的类型相同且名称唯一。代码非常简单:
CREATE TABLE Vehicle(
vin VARCHAR(25),
ID VARCHAR(20),
make VARCHAR(20),
model VARCHAR(20),
year_ VARCHAR(20),
condition_ VARCHAR(20),
PRIMARY KEY(vin, ID),
FOREIGN KEY(ID) REFERENCES Listing(CarID)
);
CREATE TABLE Listing(
CarID VARCHAR(20),
state_ VARCHAR(20),
price INT(10),
url VARCHAR(50),
PRIMARY KEY(CarID),
FOREIGN KEY(CarID) REFERENCES Vehicle(ID)
);
解决方案
如果 Vehicle 的主键是(vin, ID)
引用它的外键,那么它也必须有两列,顺序相同,数据类型相同。
但是在您的情况下,您的列表表没有vin
列,因此它不能引用 Vehicle 的主键。
Listing引用Vehicle的部分主键意味着什么?不能保证只有一行具有给定的ID
in Vehicle 值。它可以有多个具有相同ID
和不同vin
值的行。因此,Listing 可能是多个车辆的子代,这可能没有意义。
因此,您必须:
向列表中添加一
vin
列,使其外键可以通过其主键(两列)精确引用一行。修改 Vehicle 表,使其
ID
成为其主键。
更新:
我刚刚注意到您似乎在两个表中都有外键。这通常不需要。当我考虑您要建模的内容时,我猜想列表有一个或多个车辆,对吗?所以 Vehicle 应该引用它的父列表。但是列表不需要引用车辆。
所以以下工作:
首先,创建父表,因为在父表存在之前,您无法创建外键。在您的情况下,列表是父表。
CREATE TABLE Listing(
CarID VARCHAR(20),
state_ VARCHAR(20),
price INT(10),
url VARCHAR(50),
PRIMARY KEY(CarID)
);
然后创建子表,其外键引用其父表。
CREATE TABLE Vehicle(
vin VARCHAR(25),
ID VARCHAR(20),
make VARCHAR(20),
model VARCHAR(20),
year_ VARCHAR(20),
condition_ VARCHAR(20),
PRIMARY KEY(vin, ID),
FOREIGN KEY(ID) REFERENCES Listing(CarID)
);
我在 MySQL 5.7.27 上进行了测试。
推荐阅读
- php - UTF-16 到 UTF-8 PHP 转换
- java - 获取 URL 中倒数第二个斜杠后的字母
- c++ - 如何返回 COM 接口?
- java - 有没有办法阻止客户端从实例调用静态方法?
- javascript - formSubmit - TypeError:无法读取未定义的属性“公司” - 应用脚本 - 编程新手
- python - 如何使用字典中每个键的第一个值有效地创建优先级队列
- amazon-web-services - terraform 错误:模块参数的值无效
- docker - Katalon 在测试套件文件夹上运行所有测试套件
- scala - 微笑scala api:从数组创建数据框
- android - Android Jetpack compose - 观察第二次更改后未触发的实时数据