在不使用迁移的情况下在 mysql 中手动创建外键约束时无法删除记录。
Unable to delete a record when created foreign-key constraints manually in mysql without using migration.
我已经手动创建了数据库表,并且我还在表中手动创建了外键约束,而没有使用迁移。现在,当我要删除一条记录时,出现以下错误-
Integrity constraint violation: Cannot delete or update a parent row:
a foreign key constraint fails
注意:我无法使用迁移,因为数据库已经创建。
在外键上使用 ON DELETE CASCADE
和 ON UPDATE CASCADE
,例如:
...(create/alter Children table query)...
CONSTRAINT FK_ParentChild
FOREIGN KEY (parent_id) REFERENCES Parents(id)
ON UPDATE CASCADE ON DELETE CASCADE;
因此您不必在删除父元素之前手动删除子元素。所有子记录将随着父记录的删除自动删除。
我建议通过执行以下操作进一步调查此问题:
- 在您的开发环境中,编写迁移以创建
从零开始的表格 2)
- 查看生成的架构并进行比较
到现有生产表的架构
- 注意
两种模式之间的差异和写入迁移以更正
生产表。
注:
如果您需要同时更正数据并且您确信数据库的数据完整性没有风险 .您可以在更正数据时使用以下语句删除外键检查。
SET FOREIGN_KEY_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 1;
我怎么强调都不过分,记得在完成后打开外键检查,不要在生产数据库上执行此操作。获取数据库的副本并在本地尝试一些事情,直到您确信您的更正是 100% 安全的;)
我已经手动创建了数据库表,并且我还在表中手动创建了外键约束,而没有使用迁移。现在,当我要删除一条记录时,出现以下错误-
Integrity constraint violation: Cannot delete or update a parent row: a foreign key constraint fails
注意:我无法使用迁移,因为数据库已经创建。
在外键上使用 ON DELETE CASCADE
和 ON UPDATE CASCADE
,例如:
...(create/alter Children table query)...
CONSTRAINT FK_ParentChild
FOREIGN KEY (parent_id) REFERENCES Parents(id)
ON UPDATE CASCADE ON DELETE CASCADE;
因此您不必在删除父元素之前手动删除子元素。所有子记录将随着父记录的删除自动删除。
我建议通过执行以下操作进一步调查此问题:
- 在您的开发环境中,编写迁移以创建 从零开始的表格 2)
- 查看生成的架构并进行比较 到现有生产表的架构
- 注意 两种模式之间的差异和写入迁移以更正 生产表。
注:
如果您需要同时更正数据并且您确信数据库的数据完整性没有风险 .您可以在更正数据时使用以下语句删除外键检查。
SET FOREIGN_KEY_CHECKS = 0;
SET FOREIGN_KEY_CHECKS = 1;
我怎么强调都不过分,记得在完成后打开外键检查,不要在生产数据库上执行此操作。获取数据库的副本并在本地尝试一些事情,直到您确信您的更正是 100% 安全的;)