Как исправить ошибки внешнего ключа в MySQL? - PullRequest
1 голос
/ 27 апреля 2019

Я использую Ubuntu на Virtualbox.Я пытаюсь написать свой SQL для базы данных, однако всякий раз, когда я создаю его с внешним ключом, он всегда возвращает ошибку

CREATE TABLE Vehicles (Идентификатор транспортного средства int, Тип транспортного средства VARCHAR (255), Модель)VARCHAR (255), Размер двигателя с плавающей точкой, Состояние VARCHAR (255), Цена с плавающей запятой, ПЕРВИЧНЫЙ КЛЮЧ (идентификатор автомобиля), ИНОСТРАННЫЙ КЛЮЧ (модель) ЛИТЕРАТУРА Модели (модель);

Можете ли вы помочь мнепожалуйста?Ниже приведены операторы таблицы 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 голосов
/ 27 апреля 2019

Столбец, на который вы ссылаетесь, должен иметь индекс, но в столбце Model_name в 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 и заменить его на Model_ID. Обычно лучше, чтобы внешние ключи указывали на первичные ключи.

0 голосов
/ 27 апреля 2019

Кажется, проблема в этом сегменте FOREIGN KEY (модель) ССЫЛКИ Models (модель));

Model_ID - это первичный ключ вашей таблицы Models, поэтому сегмент оператора долженbe FOREIGN KEY (модель) ЛИТЕРАТУРА Модели (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)
);
0 голосов
/ 27 апреля 2019

Ваш SQL содержит пробелы как часть идентификатора, что недопустимо.Например (идентификатор клиента), а не (идентификатор клиента).Это верно в вашем примере кода.Кроме того, при работе с внешними ключами убедитесь, что у вас тот же тип, в том числе со знаком / без знака.Если вы используете utf8mb4, индекс varchar ограничен 191, а не 255, и вы захотите, чтобы ваше поле, на которое ссылается внешний ключ, также было индексом.(Этот совет МОЖЕТ быть устаревшим, в зависимости от вашей версии, но пробелы являются проблемой.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...