首页 > 解决方案 > 外键约束格式不正确

问题描述

我遇到了一个问题,我无法创建一些表,因为它们的外键“格式不正确”。我不知道为什么会出现此错误,因为键的类型相同且名称唯一。代码非常简单:

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

标签: mysqlsqlforeign-keys

解决方案


如果 Vehicle 的主键是(vin, ID)引用它的外键,那么它也必须有两列,顺序相同,数据类型相同。

但是在您的情况下,您的列表表没有vin列,因此它不能引用 Vehicle 的主键。

Listing引用Vehicle的部分主键意味着什么?不能保证只有一行具有给定的IDin 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 上进行了测试。


推荐阅读