web-dev-qa-db-ja.com

MySQLの既存の行のInsertステートメントを取得します

MySQLを使用して、クエリを実行できます。

SHOW CREATE TABLE MyTable;

そして、特定のテーブルのcreate tableステートメントを返します。これは、テーブルが既に作成されていて、別のデータベースに同じテーブルを作成する場合に便利です。

すでに存在する行、または行のセットに対してinsertステートメントを取得することは可能ですか?一部のテーブルには多くの列があり、挿入ステートメントを書き出すことなく、またはデータをCSVにエクスポートしてから同じデータをインポートすることなく、挿入ステートメントを取得して行を別のデータベースに転送できることは素晴らしいことです他のデータベースに。

明確にするために、私が欲しいのは次のように機能するものです:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

そして、次のものが返されます:

INSERT INTO MyTable(ID,Col1,Col2,Col3) VALUES (10,'hello world','some value','2010-10-20');
115
Kibbee

MySQLコンソールからINSERTステートメントを取得する方法はないようですが、Robが提案したようにmysqldumpを使用して取得できます。テーブルの作成を省略するには、-tを指定します。

mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"
137
Kaivosukeltaja

MySQL Workbenchでは、単一テーブルクエリの結果をINSERTステートメントのリストとしてエクスポートできます。クエリを実行してから、次の操作を行います。

Snapshot of export button

  1. 結果の上にあるExport/Importの近くのフロッピーディスクをクリックします
  2. ターゲットファイルに名前を付けます
  3. ウィンドウの下部で、Formatに対してSQL INSERT statementsを選択します
  4. Saveをクリックします
  5. Exportをクリックします
55
Zoltán

これを行うphp関数を作成しました。履歴テーブルの削除後にレコードを置き換える必要がある場合に備えて、挿入ステートメントを作成する必要がありました。

function makeRecoverySQL($table, $id)
{
    // get the record          
    $selectSQL = "SELECT * FROM `" . $table . "` WHERE `id` = " . $id . ';';

    $result = mysql_query($selectSQL, $YourDbHandle);
    $row = mysql_fetch_assoc($result); 

    $insertSQL = "INSERT INTO `" . $table . "` SET ";
    foreach ($row as $field => $value) {
        $insertSQL .= " `" . $field . "` = '" . $value . "', ";
    }
    $insertSQL = trim($insertSQL, ", ");

    return $insertSQL;
}
10
Chris Adams

SHOW CREATE TABLE MyTableによって生成されたSQLを使用してテーブルをコピーしたため、次の手順を実行するだけで新しいテーブルにデータをロードできます。

INSERT INTO dest_db.dest_table SELECT * FROM source_db.source_table;

INSERTステートメントが本当に必要な場合、知っている唯一の方法はmysqldumphttp://dev.mysql。 com/doc/refman/5.1/en/mysqldump.htm 。特定のテーブルのデータをダンプするだけでなく、行を制限することもできます。

10
Rob Prouse

Laptop Liftのコードは問題なく動作しますが、人々が気に入ると思うものがいくつかありました。

データベースハンドラは引数であり、ハードコードされていません。新しいmysql apiを使用しました。柔軟性のために、$ idをオプションの$ where引数に置き換えました。誰かがSQLインジェクションを実行しようとし、引用符が関係する単純な破損を避けるために、real_escape_stringを使用しました。 INSERT table (field...) VALUES (value...)...構文を使用して、フィールドを1回だけ定義し、各行の値を一覧表示するようにしました(破裂音は素晴らしいです)。 Nigel Johnsonが指摘したので、NULL処理を追加しました。

$array[$key]を使用したのは、何らかの形で変更される可能性があるのではないかと心配していたからです。

<?php
function show_inserts($mysqli,$table, $where=null) {
    $sql="SELECT * FROM `{$table}`".(is_null($where) ? "" : " WHERE ".$where).";";
    $result=$mysqli->query($sql);

    $fields=array();
    foreach ($result->fetch_fields() as $key=>$value) {
        $fields[$key]="`{$value->name}`";
    }

    $values=array();
    while ($row=$result->fetch_row()) {
        $temp=array();
        foreach ($row as $key=>$value) {
            $temp[$key]=($value===null ? 'NULL' : "'".$mysqli->real_escape_string($value)."'");
        }
        $values[]="(".implode(",",$temp).")";
    }
    $num=$result->num_rows;
    return "INSERT `{$table}` (".implode(",",$fields).") VALUES \n".implode(",\n",$values).";";
}
?>
9
Chinoto Vokro

プログラム SQLYOG を使用して、選択クエリを作成し、screenshot 結果を取得し、sqlとしてエクスポートを選択します。これにより、挿入ステートメントが提供されます。

6
Henrik

MySQLワークベンチ内で次を実行します。

  1. [サーバー]> [データのエクスポート]をクリックします

  2. [オブジェクトの選択]タブで、目的のスキーマを選択します。

  3. 次に、スキーマの右側にあるリストボックスを使用して、目的のテーブルを選択します。

  4. スクリプトをエクスポートするファイルの場所を選択します。

  5. 完了をクリックします。

  6. 新しく作成されたファイルに移動し、挿入ステートメントをコピーします。

5
Kevin Bowersox

テーブルの「ステートメントの挿入」が必要な場合は、次のコードを試してください。

SELECT 
    CONCAT(
        GROUP_CONCAT(
            CONCAT(
                'INSERT INTO `your_table` (`field_1`, `field_2`, `...`, `field_n`) VALUES ("',
                `field_1`,
                '", "',
                `field_2`,
                '", "',
                `...`,
                '", "',
                `field_n`,
                '")'
            ) SEPARATOR ';\n'
        ), ';'
    ) as `QUERY`
FROM `your_table`;

その結果、次の文が挿入されます。

INSERT INTO your_tablefield_1field_2...field_n)VALUES(value_11、value_12、...、value_1n);

INSERT INTO your_tablefield_1field_2...field_n)VALUES(value_21、value_22、...、value_2n);

/ ................................................. .... /

INSERT INTO your_tablefield_1field_2...field_n)VALUES(value_m1、value_m2、...、value_mn);

、ここでm-your_tableのレコード数

4
slava157

sequel proを使用してこれを行うことができます。得られた結果に対して「挿入ステートメントとして取得」するオプションがあります

3
flash

PDOを使用すると、この方法でそれを行うことができます。

$stmt = DB::getDB()->query("SELECT * FROM sometable", array());

$array = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $fields = array_keys($array[0]);

    $statement = "INSERT INTO user_profiles_copy (".implode(",",$fields).") VALUES ";
    $statement_values = null;

    foreach ($array as $key => $post) {
        if(isset($statement_values)) {
            $statement_values .= ", \n";
        }

        $values = array_values($post);
        foreach($values as $index => $value) {
            $quoted = str_replace("'","\'",str_replace('"','\"', $value));
            $values[$index] = (!isset($value) ? 'NULL' : "'" . $quoted."'") ;
        }

        $statement_values .= "(".implode(',',$values).")";


    }
    $statement .= $statement_values . ";";

    echo $statement;
1
Josh Bernfeld

HeidiSQLユーザーの場合

HeidiSQLを使用する場合、挿入ステートメントを取得する行を選択できます。次に、右クリック>グリッド行のエクスポート>「出力ターゲット」に「クリップボードにコピー」を選択し、「行選択」に「選択」を選択して、他の行をエクスポートしないようにします。「出力形式」に「SQL INSERT」>.

enter image description here

Insertステートメントはクリップボード内にあります。

1
fall

以下のコードでSPを作成できます-NULLもサポートします。

select 'my_table_name' into @tableName;

/*find column names*/
select GROUP_CONCAT(column_name SEPARATOR ', ') from information_schema.COLUMNS
where table_schema =DATABASE()
and table_name = @tableName
group by table_name
into @columns
;

/*wrap with IFNULL*/
select replace(@columns,',',',IFNULL(') into @selectColumns;
select replace(@selectColumns,',IFNULL(',',\'~NULL~\'),IFNULL(') into @selectColumns;

select concat('IFNULL(',@selectColumns,',\'~NULL~\')') into @selectColumns;

/*RETRIEVE COLUMN DATA FIELDS BY PK*/
SELECT
  CONCAT(
    'SELECT CONCAT_WS(','''\'\',\'\''',' ,
    @selectColumns,
    ') AS all_columns FROM ',@tableName, ' where id = 5 into @values;'
    )
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;

/*Create Insert Statement*/
select CONCAT('insert into ',@tableName,' (' , @columns ,') values (\'',@values,'\')') into @prepared;

/*UNWRAP NULLS*/
select replace(@prepared,'\'~NULL~\'','NULL') as statement;
1
snyman

Laptop Liftsが提供する答えは最高だと思います...しかし、誰も私が使用するアプローチを提案しなかったので、私は中に入れるべきだと思いました。その中に、必要な行の横にチェックマークを付けるだけで、下部で[エクスポート]をクリックして[SQL]を選択します。選択したレコードのINSERTステートメントが提供されます。お役に立てれば。

0
techtheatre