如何将父表和子表数据移动到存档表(具有相同的列)

Posted

技术标签:

【中文标题】如何将父表和子表数据移动到存档表(具有相同的列)【英文标题】:How can I move parent & child tables data to archive tables (which has same columns) 【发布时间】:2017-12-23 06:46:19 【问题描述】:

假设我有父表:Transaction_Logger

--------------------------------------------
Id     | Txn_Name   | Txn_Status  | Txn_Time
--------------------------------------------
101    | C2C        | Executed    | 11-july-17
--------------------------------------------
201    | B2B        | Aborted     | 11-July-17
--------------------------------------------
301    | B2C        | Executed    | 12-July-17

和子表:Transaction_Error(Txn_Id 是外键,带有 Transaction_Logger 表 ID 列)

 ------------------------------------
    Id     | Error_msg     | Txn_Id 
 ------------------------------------
    410    | some error msg| 201   
 ------------------------------------ 

我还有另外 2 个分别具有相同结构 Transaction_Logger_Archive 和 Transaction_Error_Archive 的表。

我们需要将主表数据归档到归档表中。如果我们将父表(Transaction_Logger)数据移动到其归档表(Transaction_Logger_Archive)然后子表(Transaction_Error)数据自动将归档到其归档表(Transaction_Error_Archive),是否有任何预定义的方式? 例如:我们有 deleteOnCascade,它在删除父表记录时删除子表记录。

我需要在数据库服务器上支持上述行为:mysql、SqlServer、Oracle 和 Hsql

【问题讨论】:

您是否尝试过在数据库上使用触发器?另外,你为什么在这个问题中使用javatag? 【参考方案1】:

您可以使用MySQL Event Scheduler。这是 MySQL 中内置的事件调度程序。

你可以指定它在指定的时间间隔调用一个过程。

阅读 MySQL 文档,但示例如下:

CREATE EVENT yourdatabase.eventname
ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
 CALL YOURPROCEDURE();

在 YOURPROCEDURE 中,您可以编写用于归档多个表的逻辑。

DELIMITER $

CREATE PROCEDURE YOURPROCEDURE()
BEGIN
BEGIN TRANSACTION;

DECLARE CURRENT_DATE_VAR DATETIME;
/*
Your stuff
*/
END$

DELIMITER ;

默认情况下,事件调度程序在 MySQL 中是禁用的。你可以打开它运行:

SET GLOBAL event_scheduler = ON;

【讨论】:

以上是关于如何将父表和子表数据移动到存档表(具有相同的列)的主要内容,如果未能解决你的问题,请参考以下文章

将数据从父表和子表加载到 DataGridView 的最简单方法,可以进行排序

什么是父表和子表

需要来自 Oracle SQL 查询的父表和子表的 XML

主表和子表是一对多,查询主表数据以及子表的某一条数据

Laravel:使用同步或 updateOrCreate 更新父表和子表?

从父表和子表中删除行