0

使用特定日期将数据库从一个复制到另一个的最佳方法是什么?
这是流程,用户对我的程序(PHP 语言)执行一些操作,然后获取一些文件。然后他需要在其他程序上上传该文件,以便复制数据库。

将被复制的只是没有结构的数据,因为结构总是相同的。

这里的例子是数据的结构

源表调用old

id | date       | value_1   | value_2   | value 3
1  | 2012-06-02 | some_data | some_data | some_data
2  | 2012-06-03 | some_data | some_data | some_data
3  | 2012-06-03 | some_data | some_data | some_data

然后用户只想下载数据以将2012-06-03其移动到名为 的新表中new。遗嘱中的结果new是:

id | date       | value_1   | value_2   | value 3
2  | 2012-06-03 | some_data | some_data | some_data
3  | 2012-06-03 | some_data | some_data | some_data

笔记:

[*]The program will be need smart enough to understand, if the `id` already in the `new` database then do `update` if not do `insert`.
[*]The table is located on different database. e.g: `db_source.old` copied to `db_target.new`

这样做的最佳逻辑是什么?或者也许已经有一些类来处理这种任务?


请理解这不是大学任务,而是我想添加到我的程序中的真实项目实施。我在这里问不是get the code问题。请给我一些线索,然后我会很乐意研究它


已经制作了一些输出数据的脚本。

一些执行收集数据脚本的片段

/**
 * Get all database data and output it in array format
 * @return array
 */
function output(){
    $return = array();
    foreach($this->getAllTableName() as $table_name){
        $this->load->model($table_name.'_model');
        $class_name = $table_name.'_model';
        $model = new $class_name;

        $return[$table_name] = array();
        $this->db->where('created >=', $this->date_start);
        $this->db->where('created <=', $this->date_end);            
        foreach((array)$model->get() as $object){               
            $return[$table_name][$object->id] = $this->wrap_value($object);
        }           
    }

    return $return;
}

输出:

在此处输入图像描述

但是还是混淆了SQL文件会被写入来了解哪些数据需要updateinsert

4

2 回答 2

3

执行一个接受 id 号(可能在数组或其他东西中)并移动数据的存储过程。表名是硬编码的吗?数据库是硬编码的吗?您始终可以为每个表编写一个存储过程,并执行逻辑来选择 php.ini 中的哪个过程。如果数据库没有硬编码,您总是可以将 in 作为参数。

不确定确切的编码,但这样的事情怎么样:

将@ids 作为“id1、id2、id3 ...”或数组传递。将它们与in子句一起使用。也使用重复插入

INSERT INTO new.table (id,date,value_1, value_2, value_3) 
  select id, date, value_1, value_2, value_3 
    from old.table 
    where id in (@ids)
  ON DUPLICATE KEY UPDATE c=3;

您只需要用更新替换 c=3 即可。这是从此处加入的更新示例

UPDATE FROM tblTransaction AS t 
LEFT JOIN tblEmployee as e 
ON e.emp_id = t.emp_id 
SET t.emp_block = e.emp_block
于 2012-06-01T22:10:55.000 回答
0

您还可以使用选择响应创建表:

create table newtbl select * from oldtbl where date='2012-06-03';

新表将继承原始表的字段定义。

于 2012-06-01T22:24:08.040 回答