Это звучит как глупый вопрос, потому что есть буквально сотни руководств.
Но независимо от того, какому учебнику я следую, чтобы создать 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 Workbench.
что выводит show create table child;
?
@BillKarwin SELECT @@default_storage_engine говорит "InnoDB"
@ysth show create table child показывает CONSTRAINT fk
FOREIGN KEY, но почему он не указан в информации о таблице?
нет подсказки; Я никогда не использовал workbench, но, судя по вопросам, которые люди задают здесь, в целом кажется, что это отличный способ не видеть, что происходит на самом деле :)
У меня установлен MySQL Workbench, но я им почти не пользуюсь. Мне всегда было труднее использовать его, чем клиент командной строки.
@ysth Похоже, это просто ошибка в графическом интерфейсе, а не проблема с моим подходом. Думаю, я могу просто продолжать свой проект, не беспокоясь.
Я протестировал ваши примеры таблиц в 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 признает ее ошибкой, но нет исправления и нет оценок того, когда оно будет исправлено.
Что такое механизм хранения по умолчанию (
SELECT @@default_storage_engine
)? Если это не «InnoDB», вам нужно будет указатьENGINE=InnoDB
в качестве параметра таблицы при создании какparent
, так иchild
. Внешние ключи не поддерживаются другими механизмами хранения.