如何在 MySQL 中真正创建外键?

uzu*_*aki 1 mysql sql foreign-keys mysql-workbench

这听起来像是一个愚蠢的问题,因为实际上有数百个教程。

但无论我按照哪个教程创建 a foreign key,或者在我的例子中创建 a composite foreign key,即使表创建总是成功,MySQL Workbench 也不会显示任何foreign key信息。

如果我创建这两个示例表

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)
);
Run Code Online (Sandbox Code Playgroud)

建表成功,但未列出外键。 在此输入图像描述

我缺少什么?这确实是很奇怪的行为,它们既不是 MySQL Workbench 显示的错误也不是警告。

Bil*_*win 7

我在 MySQL Workbench 8.0.28 中测试了您的示例表。它成功地创建了child带有外键的表。我运行SHOW CREATE TABLE child并输出显示外键。

但是 MySQL Workbench 显然有一个在可视表信息中显示外键的错误。我像你一样查看了外键选项卡。我按下“刷新”按钮并收到以下消息:

错误

未处理的异常:结果集的列约束名称无效

检查日志以获取更多详细信息。

我检查了日志(帮助->显示日志文件)并看到了以下内容:

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
Run Code Online (Sandbox Code Playgroud)

此错误于 2021 年 2 月报告:https://bugs.mysql.com/bug.php?id= 102496(以及上面评论中的重复错误 ysth 链接)。该错误是“已验证”,这意味着 MySQL 团队承认它是一个错误,但没有修复,也没有估计何时修复。