如何真正在 MySQL 中创建外键?
How to REALLY create a foreign key in MySQL?
这听起来像是一个愚蠢的问题,因为实际上有数百个教程。
但是无论我按照哪个教程创建 foreign key
,或者就我而言,创建 composite foreign key
,即使 table 创建总是成功,MySQL Workbench 不显示任何 foreign key
信息。
如果我创建这两个示例 tables
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)
);
table创建成功但未列出外键。
我错过了什么?这真的很奇怪,它们既不是错误也不是 MySQL Workbench.
显示的警告
我在 MySQL Workbench 8.0.28 中测试了您的示例 tables。它使用外键成功创建了 child
table。 I 运行 SHOW CREATE TABLE child
并且输出显示外键。
但是 MySQL Workbench 显然有一个在视觉 table 信息中显示外键的错误。我和你一样查看了外键选项卡。我按下“刷新”按钮并收到此消息:
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 年 2 月报告:https://bugs.mysql.com/bug.php?id=102496(以及上面评论中指向的重复错误 ysth 链接)。该错误已“验证”,这意味着 MySQL 团队承认它是一个错误,但没有修复,也没有估计何时会修复。
这听起来像是一个愚蠢的问题,因为实际上有数百个教程。
但是无论我按照哪个教程创建 foreign key
,或者就我而言,创建 composite foreign key
,即使 table 创建总是成功,MySQL Workbench 不显示任何 foreign key
信息。
如果我创建这两个示例 tables
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)
);
table创建成功但未列出外键。
我错过了什么?这真的很奇怪,它们既不是错误也不是 MySQL Workbench.
显示的警告我在 MySQL Workbench 8.0.28 中测试了您的示例 tables。它使用外键成功创建了 child
table。 I 运行 SHOW CREATE TABLE child
并且输出显示外键。
但是 MySQL Workbench 显然有一个在视觉 table 信息中显示外键的错误。我和你一样查看了外键选项卡。我按下“刷新”按钮并收到此消息:
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 年 2 月报告:https://bugs.mysql.com/bug.php?id=102496(以及上面评论中指向的重复错误 ysth 链接)。该错误已“验证”,这意味着 MySQL 团队承认它是一个错误,但没有修复,也没有估计何时会修复。