复制具有特定日期的数据库

时间:2012-06-01 21:44:42

标签: php mysql

将数据库从一个数据库复制到另一个具有特定日期的最佳方法是什么? 这是流程,用户对我的程序(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;
}

输出:

enter image description here

但仍然会对SQL文件感到困惑,以便了解哪些数据需要updateinsert

2 个答案:

答案 0 :(得分:3)

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

不确定确切的编码,但是这样的事情如何:

将@ids传递为“id1,id2,id3 ......”或数组。将它们与in子句一起使用。还可以使用insert-on-duplicate

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即可。以下是来自here

的加入更新示例
UPDATE FROM tblTransaction AS t 
LEFT JOIN tblEmployee as e 
ON e.emp_id = t.emp_id 
SET t.emp_block = e.emp_block

答案 1 :(得分:0)

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

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

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