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

标签 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 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 文件感到困惑,以了解哪些数据需要更新插入

最佳答案

执行一个存储过程,接受 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

关于php - 复制具有特定日期的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10857748/

相关文章:

php查询选择mysql到表网格的列

mysql - SQL 按包含的字符串排序

Python MySQLdb 没有返回上次查询的结果?

java - 如何从本地计算机连接 CPanel MySql DB

php - 避免在 Kohana 3 的 MySQL 查询中使用 RAND()

php - 是否可以通过标准机制(即文件系统路径)公开 S3 存储?

PHP表单验证提交问题

php - 如何在php中从数据库中归档下载多个文件

php - 抓取任何以 http 开头的字符串,直到 php 中的第一个空格字符

javascript - 我想使用 ajax 编辑进入 while 循环的品牌名称,数据在输入类型 =“文本”中