【发布时间】:2017-12-11 17:54:31
【问题描述】:
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
显然,我尝试创建的外键似乎已经在数据库中。网络上的一些研究让我相信在某些情况下 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 foreign-keys