【问题标题】:How to fix foreign key errors in MySQL?如何修复 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)); 

【问题讨论】:

  • 正确格式化您的代码。
  • @EdwardBarnard 我认为他与此有关,因为当列名包含空格时,您必须使用反引号。但这只是这段代码中的几个问题之一。
  • @barmar 我已对其进行了编辑以更改此设置,因此现在空格中的 _ 是正确的。
  • @EdwardBarnard:嗯,他们使用带空格的标识符,这需要反引号。但是好吧,还有Model vs Model IDModel_ID,所以这不是唯一的问题,我撤回了接近投票。

标签: mysql sql foreign-keys


【解决方案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)
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 2016-03-22
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多