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

时间:2019-04-26 23:05:40

标签: mysql sql foreign-keys

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

  

创建表车辆(车辆ID整型,车辆类型VARCHAR(255),型号VARCHAR(255),发动机尺寸浮动,条件VARCHAR(255),价格浮动,主键(车辆ID),外键(型号)参考) Models(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)); 

3 个答案:

答案 0 :(得分:0)

您的SQL在标识符中包含空格,这是不允许的。例如(客户ID)而非(客户ID)。在您的示例代码中都是如此。另外,在使用外键时,请确保您具有相同的类型,包括带符号/无符号。如果您使用的是utf8mb4,则varchar索引限制为191,而不是255,并且您希望使用外键引用的字段也成为索引。 (根据您的版本,此建议可能已过时,但是空格是个问题。)

答案 1 :(得分:0)

您引用的列必须具有索引,但是Model_name的{​​{1}}列上没有索引。您需要添加:

Models
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代替。通常最好让外键指向主键。

答案 2 :(得分:0)

问题似乎出在这个细分市场上 FOREIGN KEY(模型)参考模型(模型))

Model_ID是表Models的主键,因此语句段应为 FOREIGN KEY(模型)REFERENCES Models(Model_ID));

此外,外键应该是数据类型相同的引用表的主键。您的车辆的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)
);