如何修复 MySQL 中的外键错误?

Posted

技术标签:

【中文标题】如何修复 MySQL 中的外键错误?【英文标题】:How to fix foreign key errors in MySQL? 【发布时间】:2019-09-16 10:55:09 【问题描述】:

我在 Virtualbox 上使用 Ubuntu。我正在尝试为数据库编写 SQL,但是每当我使用外键创建 SQL 时,它总是返回错误

CREATE TABLE 车辆(车辆 ID int、车辆类型 VARCHAR(255)、型号 VARCHAR(255)、发动机尺寸浮动、条件 VARCHAR(255)、价格浮动、主键(车辆 ID)、外键(模型)参考型号(Model));

你能帮帮我吗?下面是我创建数据库的 SQL 表语句,所以我的代码可能有错误?

CREATE TABLE Models (
     Model_ID int NOT NULL,
     Manufacturer VARCHAR(255) NOT NULL,
     Model_name VARCHAR(255) NOT NULL,
     Wheel_Drive_Type VARCHAR(255) NOT NULL,
     PRIMARY KEY (Model_ID)); 

CREATE TABLE Customers (
     Customer_ID int NOT NULL,
     Customer_name VARCHAR(255) NOT NULL,
     Customer_Contact_number VARCHAR(255) NOT NULL,
     Customer_Address VARCHAR(255) NOT NULL,
     Customer_Email VARCHAR(255) NOT NULL,
     PRIMARY KEY (Customer_ID)); 

CREATE TABLE Vehicles (
     Vehicle_ID int NOT NULL,
     Vehicle_Type VARCHAR(255) NOT NULL,
     Model_name VARCHAR(255) NOT NULL,
     Engine_Size float NOT NULL,
     Condition VARCHAR(255) NOT NULL,
     Price float NOT NULL,
     PRIMARY KEY (Vehicle_ID),
     FOREIGN KEY (Model) REFERENCES Models(Model_name)); 

CREATE TABLE Enquiries (
     Enquiry_ID int NOT NULL,
     Vehicle int NOT NULL,
     Customer_ID int NOT NULL,
     Additional_information VARCHAR(255) NOT NULL,
     PRIMARY KEY (Enquiry_ID),
     FOREIGN KEY (Vehicle_ID) REFERENCES Vehicles(Vehicle_ID),
     FOREIGN KEY (Customer_ID) REFERENCES Customers(Customer_ID)); 

CREATE TABLE Sales (
     Sales_ID int NOT NULL,
     Vehicle_ID int NOT NULL,
     Customer_ID int NOT NULL,
     Date_of_sale VARCHAR(255) NOT NULL,
     Sale_Type VARCHAR(255) NOT NULL,
     PRIMARY KEY (Sale_ID),
     FOREIGN KEY (Vehicle_ID) REFERENCES Vehicles(Vehicle_ID),
     FOREIGN KEY (Customer_ID) REFERENCES Customers(Customer_ID)); 

【问题讨论】:

正确格式化您的代码。 When to use single quotes, double quotes, and back ticks in mysql的可能重复 @EdwardBarnard 我认为他与此有关,因为当列名包含空格时,您必须使用反引号。但这只是这段代码中的几个问题之一。 @barmar 我已对其进行了编辑以更改此设置,因此现在空格中的 _ 是正确的。 @EdwardBarnard:嗯,他们使用带空格的标识符,这需要反引号。但是好吧,还有Model vs Model IDModel_ID,所以这不是唯一的问题,我撤回了接近投票。 【参考方案1】:

您的 SQL 将空格作为标识符的一部分,这是不允许的。例如 (Customer ID) 而不是 (Customer_ID)。在整个示例代码中都是如此。此外,在使用外键时,请确保您具有相同的类型,包括有符号/无符号。如果您使用的是 utf8mb4,则 varchar 索引限制为 191 而不是 255,并且您希望使用外键引用的字段也是索引。 (此建议可能已过时,具体取决于您的版本,但空格是个问题。)

【讨论】:

允许使用空格,但您必须在名称周围加上反引号,因此它们通常不是一个好主意。但是他并不一致,他有Model_ID作为列名,但是PRIMARY KEY(Model ID)。它们必须相同。 我已对其进行了编辑以更改此设置,因此现在空格中的 _ 是正确的。【参考方案2】:

您引用的列必须有索引,但Models 中的Model_name 列上没有索引。您需要添加:

INDEX (Model_name)
CREATE TABLE Models (
     Model_ID int NOT NULL,
     Manufacturer VARCHAR(255) NOT NULL,
     Model_name VARCHAR(255) NOT NULL,
     Wheel_Drive_Type VARCHAR(255) NOT NULL,
     PRIMARY KEY (Model_ID)
     INDEX (Model_name));

我建议您将Model_name 列从Vehicles 中取出,并将其替换为Model_ID。通常最好让外键指向主键。

【讨论】:

模型列现在已适当地重命名为 Model_name - 但是没有任何外键实例起作用? 由于其他外键引用Vehicles,如果不能创建这个表,就会报错。【参考方案3】:

问题似乎出在这一段FOREIGN KEY (Model) REFERENCES Models(Model));

Model_ID是你的表Models的主键,因此语句段应该是FOREIGN KEY (Model) REFERENCES Models(Model_ID));

另外,外键应该是具有相同数据类型的引用表的主键。 Vehicles 的 DDL 应如下所示

CREATE TABLE Vehicles (
    Vehicle_ID int, 
    Vehicle_Type VARCHAR(255), 
    Model_ID int, 
    Engine_Size float, 
    Condition VARCHAR(255), 
    Price float, 
    PRIMARY KEY (Vehicle ID), 
    FOREIGN KEY (Model_ID) REFERENCES Models(Model_ID)
);

【讨论】:

以上是关于如何修复 MySQL 中的外键错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复不兼容的外键约束spring boot

具有意外相似重复的 postgres 用户表导致另一个表具有混乱的外键,如何修复和合并外键?

如何修复“MySQL 错误:1822。缺少约束索引”关于创建复合外键

如何修复此错误 3734:无法在 MySQL WorkBench 上添加外键约束?

删除连接表的重复记录并修复相关表上的外键

修复 ORA-02273: 这个唯一/主键被一些外键引用