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;
}

出力:

ここに画像の説明を入力

updateしかし、どのデータが必要であるかを理解するために、SQL ファイルと混同されます。insert

4

2 に答える 2

3

ID番号(おそらく配列など)を受け入れてデータを移動するストアドプロシージャを実行します。テーブル名はハードコーディングされていますか?データベースはハードコーディングされていますか?テーブルごとにストアドプロシージャをいつでも記述でき、phpでどのプロシージャを選択するかをロジックで実行できます。データベースがハードコーディングされていない場合は、いつでもパラメータとして取り込むことができます。

正確なコーディングはわかりませんが、次のようなものはどうでしょうか。

@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をアップデートに置き換えるだけです。ここから参加して更新する例を次に示します。

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

select レスポンスを使用してテーブルを作成することもできます。

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

新しいテーブルは、元のテーブルからフィールド定義を継承します。

于 2012-06-01T22:24:08.040 に答える