WedX - журнал о программировании и компьютерных науках

У меня возникла проблема с моей программой sql с внешними ключами

create database MALL; 
use MALL;

create table customer (
    customer_id int not null,
    name varchar (20),
    lastname varchar(20),
    registration_date date,
    primary key (customer_id)
);

create table inventory (
    item_id int not null,
    item_name varchar(20), 
    cost int,
    primary key (item_id)
);

create table purchase (
    purchase_date date,
    purchase_count int, 
    customer_id int,
    item_name varchar(20),
    foreign key (customer_id) references customer(customer_id),
    foreign key (item_name) references inventory(item_name)
);

Я получаю эту ошибку

ОШИБКА 1822 (HY000): не удалось добавить ограничение внешнего ключа. Отсутствует индекс для ограничения "Purchase_ibfk_2" в указанной таблице "inventory"

06.11.2020

  • Код ошибки очень явный (и точный) 06.11.2020
  • В таблице покупок должен быть столбец item_id вместо столбца item_name. И это должен быть ФК. 06.11.2020
  • Вы хотите иметь item_id в таблице purchase, а затем создать FK на item_id. FK относятся к PK, а не к полям описания. 06.11.2020
  • Вам необходимо прочитать сначала документация: MySQL требует индексов по внешним ключам и ссылочным ключам, чтобы проверка внешнего ключа могла быть быстрой и не требовала сканирования таблицы. В ссылающейся таблице должен быть индекс, в котором столбцы внешнего ключа перечислены как первые столбцы в том же порядке. 06.11.2020

Ответы:


1

Здесь:

create table purchase (
    ...
    foreign key (item_name) references inventory(item_name)
)

Столбец, на который ссылается внешний ключ, должен иметь уникальный индекс: inventory(item_name) его не имеет. Я бы просто рекомендовал ссылаться на первичный ключ inventory, а не на какой-либо другой столбец:

create table purchase (
    purchase_date date,
    purchase_count int, 
    customer_id int,
    item_id int,
    foreign key (customer_id) references customer(customer_id),
    foreign key (item_id) references inventory(item_id)
);
06.11.2020
  • Добро пожаловать, @ 0xAli. Если мой ответ правильно отвечает на ваш вопрос, то примите его, щелкнув значок галочки ... Спасибо. 06.11.2020
  • Уникальный - это хорошо, но не обязательно. Без уникального он тоже работает. 06.11.2020
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]