2

我正在将 Doctrine2.2.2 与 Symfony 2.0.15 一起使用。我注意到在使用类表继承时,例如:

/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
 */

这将在子实体/表(在本例中为员工)上创建外键级联删除约束。Doctrine在这方面的文档包含一个看起来很重要的黄色框,上面写着:

当您不使用 SchemaTool 生成所需的 SQL 时,您应该知道删除类表继承会在所有数据库实现中使用外键属性 ON DELETE CASCADE。自己未能实现这一点将导致数据库中出现死行。

这对我来说没有意义。这是否意味着如果您不使用 SchemaTool 那么 Doctrine 将创建外键级联删除约束?如果确实使用了 SchemaTool,Doctrine 会使用它的内置级联功能吗?

4

1 回答 1

2

也就是说,当您使用 SchemaTool 生成 SQL 时,它还会将适当的 ON DELETE CASCADE 部分添加到您的外键约束中。

ALTER TABLE Employee ADD CONSTRAINT FK_55D6C234BF396750 
    FOREIGN KEY (id) REFERENCES Parent(id) ON DELETE CASCADE;

如果您不使用 SchemaTool,则需要确保外键约束具有 ON DELETE CASCADE 部分,否则当您从 Employee 表中删除行时,您最终会在父表中出现孤立行。

于 2012-06-08T02:19:39.350 回答