将特定日期的数据库从一个数据库复制到另一个数据库的最佳方法是什么?
这是流程,用户对我的程序(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;
}
输出:
但仍然对将要写入的 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/