Как исправить ошибки внешнего ключа в MySQL?

1

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

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

Не могли бы вы мне помочь? Ниже приведены операторы таблицы 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)); 
  • 0
    Отформатируйте ваш код правильно.
  • 0
    Возможный дубликат использования в MySQL одинарных, двойных и обратных тиков
Показать ещё 5 комментариев
Теги:
mysqli
foreign-keys

3 ответа

0

Кажется, проблема в этом сегменте. ИНОСТРАННЫЙ КЛЮЧ (модель) ЛИТЕРАТУРА Модели (модель);

Model_ID - это первичный ключ вашей таблицы Models, поэтому сегментом оператора должен быть FOREIGN KEY (Model) 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)
);
0

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

  • 1
    Пробелы разрешены, но вы должны ставить галочки вокруг имени, поэтому они, как правило, не очень хорошая идея. Но он не согласован, у него есть Model_ID качестве имени столбца, но PRIMARY KEY(Model ID) . Они должны быть одинаковыми.
  • 1
    Я отредактировал, чтобы изменить это, так что теперь это правильно с _ в пробелах.
0

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

  • 0
    Столбец модели теперь соответствующим образом переименован в Model_name - хотя ни один из экземпляров внешних ключей не работает?
  • 0
    Поскольку другие внешние ключи ссылаются на Vehicles , они получат ошибку, если вы не сможете создать эту таблицу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню