如何修复 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 ID
或Model_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 中的外键错误?的主要内容,如果未能解决你的问题,请参考以下文章
具有意外相似重复的 postgres 用户表导致另一个表具有混乱的外键,如何修复和合并外键?
如何修复“MySQL 错误:1822。缺少约束索引”关于创建复合外键