我有一个测试套件,需要删除本地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实用程序?我打算用这种方式编写一些遍历我们域名注释和派生表名称的东西,但对于一个相当常见的问题似乎有很多工作要做。谢谢!
答案 0 :(得分:1)
您可能会发现此处找到的代码非常有用....我做到了!它遍历所有sql数据库外键并以正确的顺序构建一个delete语句列表。它的sql server代码 - 我假设我的sql中有类似的工具,所以这个技术可以移植。
答案 1 :(得分:0)
处理此问题的一种好方法是在每个表上使用DELETE触发器。在CUSTOMER表上,将触发删除所有相关数据,这些数据是通过跟随与给定CUSTOMER_ID相关的每个外键返回的CUSTOMER_ID - 同样对于与CUSTOMER相关的每个表 - 以及与这些表相关的每个表等。例如,如果CUSTOMER_EMAIL表通过CUSTOMER_ID与CUSTOMER相关,同样CUSTOMER_PHONE,那么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;
分享并享受。