Ошибка внешнего ключа - ОШИБКА 1005 (HY000) ... Невозможно создать таблицу ... `сохраненный_он` (номер ошибки: 150) - PullRequest
0 голосов
/ 24 апреля 2020

Я создаю две таблицы в mariadb. Отношение Store_on связывает полку и книгу вместе. Все работает отлично, за исключением того, что я добавил lib_floor в сохраненное отношение, и эта ошибка внезапно появляется. Когда я удаляю lib_floor, определение внешнего ключа для lib_floor и lib_floor из сохраненного на первичном ключе, проблем не возникает. Любые идеи? Тип данных одинаковый (INT).

CREATE TABLE shelf (
    shelf_number        INT            NOT NULL,
    lib_name            VARCHAR(50)    NOT NULL,
    lib_floor           INT            NOT NULL,
    FOREIGN KEY (lib_name) REFERENCES library (lib_name) ON DELETE CASCADE,
    PRIMARY KEY (shelf_number,lib_name,lib_floor)
);  

CREATE TABLE stored_on (    
    shelf_number      INT            NOT NULL,
    lib_name          VARCHAR(50)    NOT NULL,
    lib_floor         INT            NOT NULL,
    isbn              VARCHAR(20)    NOT NULL,
    total_copies      INT            NOT NULL,
    FOREIGN KEY (shelf_number) REFERENCES shelf (shelf_number) ON DELETE CASCADE,
    FOREIGN KEY (lib_name) REFERENCES shelf (lib_name) ON DELETE CASCADE,
    FOREIGN KEY (lib_floor) REFERENCES shelf (lib_floor) ON DELETE CASCADE,
    FOREIGN KEY (isbn)  REFERENCES book (isbn) ON DELETE CASCADE,
    PRIMARY KEY (shelf_number,lib_name,lib_floor,isbn)
);

Предупреждение 1:

| Предупреждение 150 | Создать таблицу .... stored_on с ограничением внешнего ключа не удалось. В ссылочной таблице нет индекса, в котором указанные столбцы отображаются как первые столбцы рядом с 'FOREIGN KEY (lib_floor) REFERENCES shelf (lib_floor) ON DELETE CASCADE, FOREIGN KEY (isbn) REFERENCES book (isbn) ON DELETE CASCADE, PRIMARY KEY ( номер полки, имя_библиотеки, lib_floor, isbn)) '. |

Ошибка 1:

| Ошибка | 1005 | Невозможно создать таблицу ... stored_on (ошибка: 150 "Ограничение внешнего ключа сформировано неправильно")

Предупреждение 2:

Предупреждение | 1215 | Невозможно добавить ограничение внешнего ключа для stored_on

1 Ответ

1 голос
/ 24 апреля 2020

Сообщение об ошибке довольно очевидно, shelf должен иметь INDEX, в котором lib_floor - первое упомянутое поле. Вы можете просто добавить INDEX (это не обязательно должно быть UNIQUE):

CREATE TABLE shelf (
    shelf_number        INT            NOT NULL,
    lib_name            VARCHAR(50)    NOT NULL,
    lib_floor           INT            NOT NULL,
    FOREIGN KEY (lib_name) REFERENCES library (lib_name) ON DELETE CASCADE,
    PRIMARY KEY (shelf_number,lib_name,lib_floor),
    INDEX (lib_floor)
); 

Обратите внимание, что вы также получите эту ошибку из lib_name, но объявление FOREIGN KEY для lib_name в shelf автоматически создает индекс для него.

Демонстрация по dbfiddle

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