如何将父表和子表数据移动到存档表(具有相同的列)
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
【问题讨论】:
您是否尝试过在数据库上使用触发器?另外,你为什么在这个问题中使用java
tag?
【参考方案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 的最简单方法,可以进行排序