我在 MySql Workbench 中的一个表的外键列表是空的。当我尝试添加丢失的 FK 时,我得到了这个结构的错误:
Executing:
ALTER TABLE <schema>.<table>
ADD INDEX <index_name> (<column_name> ASC);
ALTER TABLE <schema>.<table_name>
ADD CONSTRAINT <constraint_name>
FOREIGN KEY (<column_name>)
REFERENCES <schema>.<ref_table_name> (<ref_column_name>)
ON DELETE CASCADE
ON UPDATE CASCADE;
Operation failed: There was an error while applying the SQL script to the database.
ERROR 1452: Cannot add or update a child row: a foreign key constraint fails (<schema>.`#sql-49f_6`, CONSTRAINT <constraint_name> FOREIGN KEY (<column_name>) REFERENCES <ref_table_name> (<ref_column_name>) ON DELETE CASCADE ON UPDATE CASCADE)
SQL Statement:
ALTER TABLE <schema>.<table_name>
ADD CONSTRAINT <constraint_name>
FOREIGN KEY (<column_name>)
REFERENCES <schema>.<ref_table_name> (<ref_column_name>)
ON DELETE CASCADE
ON UPDATE CASCADE
显然,我要创建的外键似乎已经在数据库中了。 Web 上的一些研究让我相信在某些情况下 MySql Workbench 不会列出所有外键(出于各种原因),这对于我的设置可能也是如此。因此,我尝试使用此查询列出我尝试修改的表中的所有外键:
SELECT *
FROM
information_schema.KEY_COLUMN_USAGE
WHERE
constraint_schema = <schema> AND table_name = <table_name> AND
referenced_table_name IS NOT NULL;
结果集和Workbench外键列表一样空...
查看错误消息,我的数据库周围似乎有一个奇怪的表,名为 #sql-49f_6
。
这张表不是我明确创建的。
也就是说,我正在使用 sqlalchemy 来创建和管理我的数据库,因此所有这些都可能是由于 sqlalchemy 模型定义所致,如下所示:
TableName = Table(<table_name>,
table_base.metadata,
Column(
<column_name_1>,
Integer(),
ForeignKey('<ref_table_name>.<ref_column_name>', onupdate='CASCADE', ondelete='CASCADE'),
nullable=False
),
Column(
<column_name_2>,
Integer(),
ForeignKey('<ref_table_name_2>.<ref_column_name_2>', onupdate='CASCADE', ondelete='CASCADE'),
nullable=False
)
)
综上所述,有人能提出解决方案吗?
最好不必重新创建数据库;因为,我需要维护表中包含的数据。
最佳答案
我无法找到上述问题的根源。 急需解决办法,我暂时将有问题的表所包含的数据离线存储,然后从头开始重新创建。在此步骤中,我还添加了外键缺失。问题没有持续存在。抱歉,我无法阐明最初出了什么问题。
关于MySql & Sqlalchemy - 并非所有外键都可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44970679/