Php 复制具有特定日期的数据库
将数据库按特定日期从一个复制到另一个的最佳方法是什么? 下面是流程,用户对我的程序PHP语言执行一些操作,然后获取一些文件。然后,他需要将该文件上传到另一个程序,以便复制数据库 要复制的只是没有结构的数据,因为结构总是相同的 这里的示例是数据的结构 名为old的源表 然后用户只想下载2012-06-03的数据,将其移动到名为new的新表中。而新计划的结果将是:Php 复制具有特定日期的数据库,php,mysql,Php,Mysql,将数据库按特定日期从一个复制到另一个的最佳方法是什么? 下面是流程,用户对我的程序PHP语言执行一些操作,然后获取一些文件。然后,他需要将该文件上传到另一个程序,以便复制数据库 要复制的只是没有结构的数据,因为结构总是相同的 这里的示例是数据的结构 名为old的源表 然后用户只想下载2012-06-03的数据,将其移动到名为new的新表中。而新计划的结果将是: id | date | value_1 | value_2 | value 3 2 | 2012-06-03 |
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传递。。。或数组。将它们与子句一起使用。也使用 你只需要用你的更新来替换c=3。下面是使用join from进行更新的示例
执行一个存储过程,该过程可以接受数组或其他形式的id号,并移动数据。表名是否硬编码?数据库是硬编码的吗?您始终可以为每个表编写一个存储过程,并按照逻辑选择php中的哪个过程。如果数据库不是硬编码的,则始终可以将in作为参数 不确定确切的编码,但是像这样的东西怎么样: 将@ids作为id1、id2、id3传递。。。或数组。将它们与子句一起使用。也使用 你只需要用你的更新来替换c=3。下面是使用join from进行更新的示例
您还可以使用select响应创建表:
create table newtbl select * from oldtbl where date='2012-06-03';
新表将从原始表继承字段定义。您也可以使用select响应创建表:
create table newtbl select * from oldtbl where date='2012-06-03';
新表将继承原始表的字段定义。表名和数据库名不是硬编码的,我添加了数据收集的详细信息。现在只需要了解如何输出SQL文件,也许以后在其他程序上重新加载SQL文件会更容易,然后您可以编写多个过程或添加更多参数。不确定它在mysql中是如何工作的,但在tsql中,您可以将查询保存为varcharmax字符串,然后运行execute@stringVariable执行它。但这确实使调试更加困难。请查看重复时的插入。我在使用tsql时没有实际尝试过,但它看起来很棒表名和数据库名不是硬编码的,我添加了数据收集的细节。现在只需要了解如何输出SQL文件,也许以后在其他程序上重新加载SQL文件会更容易,然后您可以编写多个过程或添加更多参数。不确定它在mysql中是如何工作的,但在tsql中,您可以将查询保存为varcharmax字符串,然后运行execute@stringVariable执行它。但这确实使调试更加困难。请查看重复时的插入。我在使用tsql时没有实际尝试过,但它看起来很棒我认为新数据库上的表在结构上已经存在,他提到检查数据行是否已经在表中,因为他想更新而不是插入数据行。对此我不确定。我们不需要创建新表。桌子已经在那儿了。我们唯一需要做的就是插入或更新数据!现在我明白了。很抱歉,我将回顾这个问题并考虑一下。我认为新数据库上的表已经存在结构方面的问题,他提到检查datarow是否已经在表中,因为他想更新而不是插入。我不确定这一点。我们不需要创建新表。桌子已经在那儿了。我们唯一需要做的就是插入或更新数据!现在我明白了。对不起,我会复习并思考这个问题。
UPDATE FROM tblTransaction AS t
LEFT JOIN tblEmployee as e
ON e.emp_id = t.emp_id
SET t.emp_block = e.emp_block
create table newtbl select * from oldtbl where date='2012-06-03';