【问题标题】:How Would One Find a Dependency-Order list of Tables to Delete for Test Data?如何找到要为测试数据删除的表的依存关系顺序列表?
【发布时间】:2011-04-27 03:58:43
【问题描述】:

我有一个测试套件需要为系统中的大量(但不是全部)表删除本地 MySQL 测试实例中的任何现有数据。

 delete from customer;

当然,customer 有不少外键,所以我还要删除几个表...

 delete from customer_email;
 delete from customer_phone;

再一次,这些表有更多的外键...

 delete from customer_email_notification;
 delete from customer_phone_call;

等等等等令人作呕。为了编写测试设置,不得不在精神上浏览整个数据模型是令人沮丧的。

我正在使用 Hibernate,所以我想知道是否有某种方法可以自动获取表的优先顺序列表,以便可以直接将其传递给删除处理程序。理想情况下:

 List<String> dependentTables = foreignKeyGraph.findAll("customer");
 deletionHandler.clean(dependentTables);

是否有 Hibernate 实用程序可以做到这一点?我打算写一些遍历我们域的注释和派生表名的东西,但是对于一个相当普遍的问题似乎需要做很多工作。谢谢!

【问题讨论】:

    标签: sql hibernate annotations foreign-keys hibernate-annotations


    【解决方案1】:

    处理此问题的一个好方法是在每个表上使用 DELETE 触发器。在 CUSTOMER 表上,将有一个触发器来删除所有相关数据,方法是跟踪每个与给定 CUSTOMER_ID 的 CUSTOMER 相关的外键 - 同样对于与 CUSTOMER 相关的每个表 - 以及与这些表相关的每个表,等等。所以例如,如果 CUSTOMER_EMAIL 表通过 CUSTOMER_ID 和 CUSTOMER_PHONE 关联回 CUSTOMER,那么 CUSTOMER 上的删除触发器可能看起来像

    CREATE TRIGGER CUSTOMER_AD  -- AD = After Delete
      AFTER DELETE ON CUSTOMER
      FOR EACH ROW
    BEGIN
      DELETE FROM CUSTOMER_EMAIL E WHERE E.CUSTOMER_ID = :NEW.CUSTOMER_ID;
      DELETE FROM CUSTOMER_PHONE P WHERE P.CUSTOMER_ID = :NEW.CUSTOMER_ID;
    END CUSTOMER_AD;
    

    分享和享受。

    【讨论】:

    • 是的,这肯定行得通。我对不需要手写的东西感兴趣(除非绝对必要)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多