Как исправить ошибки внешнего ключа в SQL - PullRequest
0 голосов
/ 29 апреля 2019

Я создаю базу данных с помощью Ubuntu и пытаюсь добавить внешний ключ в таблицу ниже.Вот мой код.

CREATE TABLE Vehicles (    
    Vehicle_ID int NOT NULL,
    Vehicle_Type VARCHAR(255) NOT NULL,
    Model_name VARCHAR(255) NOT NULL,
    Engine_Size numeric(2,1) NOT NULL,
    Vehicle_Condition VARCHAR(255) NOT NULL,
    Price numeric(9,2) NOT NULL,
    PRIMARY KEY (Vehicle_ID)
);


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)
);

Всякий раз, когда я запускаю приведенный ниже код, он возвращает ошибку «ОШИБКА 1215 (HY000): Невозможно добавить ограничение внешнего ключа», и я понятия не имею, почему - тем более, что у них обоих одинаковыетип ввода.

ALTER TABLE Vehicles
    ADD FOREIGN KEY (Model_Name) REFERENCES Models(Model_Name);

ОШИБКА 1215 (HY000): не удается добавить ограничение внешнего ключа

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

Согласно https://www.w3schools.com/sql/sql_foreignkey.asp

FK, который вы хотите создать, должен ссылаться на таблицу моделей PK, которая имеет Model_ID.

Вы пытаетесь связать его с Model_name, которое не является уникальным.

CREATE TABLE Vehicles (    
Vehicle_ID int NOT NULL,
Vehicle_Type VARCHAR(255) NOT NULL,
Model_ID INT NOT NULL,
Engine_Size numeric(2,1) NOT NULL,
Vehicle_Condition VARCHAR(255) NOT NULL,
Price numeric(9,2) NOT NULL,
    PRIMARY KEY (Vehicle_ID)
);


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)
);

И вам будет разрешено сделать

ALTER TABLE Vehicles
    ADD FOREIGN KEY (Model_ID ) REFERENCES Models(Model_ID );

Как доказано здесь http://www.sqlfiddle.com/#!9/8b6ad7

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

Мне удалось это исправить, сделав несколько вещей.Все, что я сделал, чтобы исправить это, пришло отсюда:

https://dev.mysql.com/doc/refman/5.5/en/alter-table.html

Конкретно заголовок: «Иностранные ключи и другие ограничения»

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

Мнение: поля внешнего и первичного ключа всегда должны быть "идентификаторами", а не "именами".Поэтому я заменил поле model_name в транспортных средствах идентификатором модели и обновил до INT (для соответствия моделям).

Затем я немного изменил синтаксис в таблице изменения:

ALTER TABLE Vehicles
    ADD CONSTRAINT model_FK FOREIGN KEY (Model_ID) REFERENCES Models(Model_ID); 

Все это работало!

Я думаю, что если вы хотите использовать имя_модели в качестве внешнего ключа в Транспортных средствах, то это либо должно быть первичным ключом для Моделей, либо вы можете добавить индекс для Моделей с помощью Model_name.Это больше соответствует сообщению об ошибке, которое я видел, когда пытался изменить таблицу, чтобы создать FK имя_модели ... что-то о "отсутствующем индексе для ограничения в ссылочных моделях таблиц".

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

Это может быть потому, что вы пытаетесь использовать поле Varchar в качестве внешнего ключа, а MySQL не любит использовать VarChar для ключей, если они не указаны как BINARY.Также суетливо задаются свойства CHARSET и COLLATE / / 1001 *

Добавление BINARY к спецификации столбца и ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;к таблице спецификации должны решить это.EG:

CREATE TABLE Vehicles (    
    Vehicle_ID int NOT NULL,
    Vehicle_Type VARCHAR(255) NOT NULL,
    Model_name VARCHAR(255) NOT NULL,
    Engine_Size numeric(2,1) NOT NULL,
    Vehicle_Condition VARCHAR(255) NOT NULL,
    Price numeric(9,2) NOT NULL,
    PRIMARY KEY (Vehicle_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


CREATE TABLE Models (
    Model_ID int NOT NULL,
    Manufacturer VARCHAR(255) NOT NULL,
    Model_name VARCHAR(255) BINARY NOT NULL,
    Wheel_Drive_Type VARCHAR(255) NOT NULL,
    PRIMARY KEY (Model_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...