Как ДЕЙСТВИТЕЛЬНО создать внешний ключ в MySQL?

Это звучит как глупый вопрос, потому что есть буквально сотни руководств.

Но независимо от того, какому учебнику я следую, чтобы создать foreign key или, в моем случае, composite foreign key, несмотря на то, что создание таблицы всегда проходит успешно, MySQL Workbench не показывает никакой информации foreign key.

Если я создам эти 2 таблицы примера

CREATE TABLE parent (
id INT NOT NULL,
category VARCHAR(255) NOT NULL,
PRIMARY KEY (id, category)
);

CREATE TABLE child (
id INT PRIMARY KEY,
category VARCHAR(255) NOT NULL,
info TEXT,
CONSTRAINT fk FOREIGN KEY (id, category) REFERENCES parent(id, category)
);

Создание таблицы прошло успешно, но внешний ключ не указан. Как ДЕЙСТВИТЕЛЬНО создать внешний ключ в MySQL?

Что мне не хватает? Это действительно странное поведение, которое не является ни ошибкой, ни предупреждением, показанным MySQL Workbench.

Что такое механизм хранения по умолчанию (SELECT @@default_storage_engine)? Если это не «InnoDB», вам нужно будет указать ENGINE=InnoDB в качестве параметра таблицы при создании как parent, так и child. Внешние ключи не поддерживаются другими механизмами хранения.

Bill Karwin 21.03.2022 17:48

что выводит show create table child;?

ysth 21.03.2022 17:55

@BillKarwin SELECT @@default_storage_engine говорит "InnoDB"

uzumaki 21.03.2022 18:19

@ysth show create table child показывает CONSTRAINT fk FOREIGN KEY, но почему он не указан в информации о таблице?

uzumaki 21.03.2022 18:21

нет подсказки; Я никогда не использовал workbench, но, судя по вопросам, которые люди задают здесь, в целом кажется, что это отличный способ не видеть, что происходит на самом деле :)

ysth 21.03.2022 18:23
bugs.mysql.com/bug.php?id=101484 ?
ysth 21.03.2022 18:28

У меня установлен MySQL Workbench, но я им почти не пользуюсь. Мне всегда было труднее использовать его, чем клиент командной строки.

Bill Karwin 21.03.2022 18:31

@ysth Похоже, это просто ошибка в графическом интерфейсе, а не проблема с моим подходом. Думаю, я могу просто продолжать свой проект, не беспокоясь.

uzumaki 21.03.2022 18:41
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
8
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я протестировал ваши примеры таблиц в MySQL Workbench 8.0.28. Он успешно создал таблицу child со своим внешним ключом. Я запустил SHOW CREATE TABLE child, и на выходе отображается внешний ключ.

Но MySQL Workbench, по-видимому, имеет ошибку, показывающую внешний ключ в информации визуальной таблицы. Я просмотрел вкладку внешних ключей, как и вы. Я нажал кнопку «обновить» и получил следующее сообщение:

Error

Unhandled exception: invalid column constraint_name for resultset

Check the log for more details.

Я проверил журнал (Справка-> Показать файл журнала) и увидел это:

10:15:53 [ERR][sqlide_tableman_ext.py:show_table:1186]: Error initializing tab constraints: Traceback (most recent call last):
  File "/Applications/MySQLWorkbench.app/Contents/Resources/plugins/sqlide_tableman_ext.py", line 1183, in show_table
    tab.show_table(schema, table)
  File "/Applications/MySQLWorkbench.app/Contents/Resources/plugins/sqlide_tableman_ext.py", line 854, in show_table
    self.refresh()
  File "/Applications/MySQLWorkbench.app/Contents/Resources/plugins/sqlide_catalogman_ext.py", line 373, in refresh
    self.preload_data(self.get_query())
  File "/Applications/MySQLWorkbench.app/Contents/Resources/plugins/sqlide_catalogman_ext.py", line 367, in preload_data
    node.set_string(i, rset.stringFieldValueByName(field) or "" if format_func is None else format_func(rset.stringFieldValueByName(field)))
SystemError: invalid column constraint_name for resultset

Об этой ошибке сообщалось в феврале 2021 года: https://bugs.mysql.com/bug.php?id=102496 (а также повторяющиеся ссылки на ошибку ysth в комментариях выше). Ошибка «Проверена», что означает, что команда MySQL признает ее ошибкой, но нет исправления и нет оценок того, когда оно будет исправлено.

Другие вопросы по теме