【问题标题】:drop table cascade doesn't remove all of the references of that tabledrop table cascade 不会删除该表的所有引用
【发布时间】:2020-08-12 14:26:01
【问题描述】:

当我运行 DROP TABLE 'User' cascade; 时,它不会从其他表中删除引用用户的记录。

如果我运行DELETE FROM 'User',它也会成功地从其他表中删除记录。如何从 DROP TABLE 执行此操作?这很重要。

顺便说一句,如果我在没有级联的情况下运行DROP TABLE 'User',它会告诉我其他表依赖于此,所以请添加级联;

【问题讨论】:

  • 我假设您的意思是DELETE FROM,而不是REMOVE FROM。先做DELETE FROM再做DROP TABLE有什么问题?
  • 是的,很好的电话,我的意思是删除,客户不想这样做,我真的很感兴趣为什么 DROP 级联也不能按预期的方式工作:/跨度>
  • 我猜你在子表的FOREIGN KEYs 上没有ON DELETE CASCADE
  • 当然有,我使用 TypeOrm NestJS 我在具有 OneToOne 和 OneToMany/ManyToOne 关系的子表中尝试了 {cascade: true} 和 onDelete: 'CASCADE',但是当我 DROP表它不会删除它的孩子
  • 是的,但实际的数据库表是否已设置。还要检查Issue"伙计们,typeorm 不会通过级联删除任何内容。它唯一做的就是设置 onDelete:"CASCADE"。实际删除是数据库的责任,所以请确保你正确理解了onDelete 在您的数据库中有效。”。 SO"显然我必须删除所有表并为 onDelete 进行新的迁移:"CASCADE" 才能生效但有效"。所以 Typeorm 有一些不稳定的行为。

标签: mysql postgresql typeorm


【解决方案1】:

如果您有一个指向表的外键约束,并且您使用CASCADE 删除该表,则外键约束将被删除,因此结果是一致的,但不是您想要的。

如果您想要级联删除,您可以简单地删除外键不为 NULL 的所有行:

DELETE FROM child
WHERE fk_col IS NOT NULL;

如果列是NOT NULLTRUNCATE 会更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多