Get Insert Statement für vorhandene Zeile in MySQL


139

Mit MySQL kann ich die Abfrage ausführen:

SHOW CREATE TABLE MyTable;

Und es wird die Anweisung create table für die angegebene Tabelle zurückgegeben. Dies ist nützlich, wenn Sie bereits eine Tabelle erstellt haben und dieselbe Tabelle in einer anderen Datenbank erstellen möchten.

Ist es möglich, die Einfügeanweisung für eine bereits vorhandene Zeile oder eine Reihe von Zeilen abzurufen? Einige Tabellen haben viele Spalten, und es wäre schön, wenn ich eine insert-Anweisung erhalten könnte, um Zeilen in eine andere Datenbank zu übertragen, ohne die insert-Anweisung ausschreiben zu müssen oder ohne die Daten in CSV zu exportieren und dann dieselben Daten zu importieren in die andere Datenbank.

Um zu verdeutlichen, was ich möchte, ist etwas, das wie folgt funktionieren würde:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

Und habe folgendes für mich zurückgegeben:

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

Mit welchem ​​Tool stellen Sie eine Verbindung zur Datenbank her? Einige Programme bieten solche Vorlagen an.
GôTô

2
@kibbee, hast du eine Lösung dafür gefunden?
Hasina

2
Würde eine Antwort lieben, die die INSERT-Anweisungen von der mysql>Eingabeaufforderung zeigte. Bisher keine.
Bob Stein

Haben Sie eine Lösung dafür gefunden, um die insert-Anweisung programmgesteuert abzurufen?
Vaibhav Jain

Antworten:


155

Es scheint keine Möglichkeit zu geben, die INSERTAnweisungen von der MySQL-Konsole abzurufen, aber Sie können sie mit mysqldump abrufen, wie Rob vorgeschlagen hat. Geben Sie -tan, dass die Tabellenerstellung weggelassen werden soll.

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

Dies wird angezeigt, wenn der Fehler mysqldump angezeigt wird: 'SELECT @@ GTID_MODE' konnte nicht ausgeführt werden: Unbekannte Systemvariable 'GTID_MODE' (1193) gist.github.com/arun057/5556563
Daniel Schaffer

10
Und Sie können "--complete-insert" hinzufügen, wenn Sie die Feld- / Spaltennamen mit der insert-Anweisung
MeatPopsicle

3
- Single-Transaktion
FelikZ

und --hex-blobwenn Sie blob - Spalten (zB bit(1)), wäre es als String schreibt sonst, was zur Folge haben könnte Unknown command '\0'Fehler bei der Ausführung von INSERT.
Moffeltje

78

In MySQL Workbench können Sie die Ergebnisse jeder einzelnen Tabellenabfrage als Liste von INSERTAnweisungen exportieren . Führen Sie einfach die Abfrage aus und dann:

Schnappschuss der Exportschaltfläche

  1. Klicken Sie auf die Diskette neben Export/Importden Ergebnissen
  2. Geben Sie der Zieldatei einen Namen
  3. am unteren Rand des Fensters zur FormatAuswahlSQL INSERT statements
  4. klicken Save
  5. klicken Export

2
Das Symbol rechts ist außerdem sehr praktisch, um den soeben erstellten Export zu importieren. Sehr schönes Feature. Der einzige schwierige Teil ist, dass Sie erst nach einer Auswahl über das Ergebnismengenfenster auf die Symbole zugreifen können.
Half_Duplex

13

Da Sie die Tabelle mit dem von SHOW CREATE TABLE MyTable erstellten SQL kopiert haben , können Sie die Daten wie folgt in die neue Tabelle laden.

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

Wenn Sie die INSERT-Anweisungen wirklich möchten, ist die einzige mir bekannte Möglichkeit, mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm zu verwenden . Sie können ihm Optionen geben, um nur Daten für eine bestimmte Tabelle zu sichern und sogar Zeilen zu begrenzen.


Die fraglichen Datenbanken existieren auf physisch unterschiedlichen Computern, in unterschiedlichen Netzwerken, daher würde diese Methode für mich nicht funktionieren, funktioniert aber gut für Datenbanken, die auf derselben Instanz von MySQL ausgeführt werden
Kibbee

Versuchen Sie, Teilmengen von Daten programmgesteuert zwischen Maschinen zu verschieben? Könnten Sie nicht die zweite Maschine zum Spiegeln von Daten sklaven und dann Ihre Teilmengen zwischen Datenbanken auf dem Slave verschieben?
Rob Prouse

1
Nehmen wir an, ich habe eine Tabelle, die Zeitzonen enthält. Aus irgendeinem Grund wird jetzt eine neue Zeitzone erstellt (möglicherweise mit einem Versatz von 15 Minuten oder ähnlichem). Also füge ich die neue Zeile zur Entwicklungsdatenbank hinzu, die alle Informationen über die neue Zeitzone enthält, und führe alle erforderlichen Tests durch. Wenn es darum geht, diese Zeitzoneninformationen in die Produktionsdatenbank zu verschieben, muss ich eine Insert-Anweisung von Grund auf neu erstellen oder einen Export / Import durchführen. Es wäre schön, wenn Sie nur die Einfügung erhalten und sie dann in die Skripte aufnehmen könnten, um die neue Zeitzone live zu bringen.
Kibbee

1
Ich habe die ursprüngliche Einfügung nicht, weil ich sie möglicherweise mit einem GUI-Tool eingefügt habe oder sie möglicherweise dreimal von den ursprünglich eingefügten Werten ändern musste.
Kibbee

1
Ich brauchte zufällig eine einfache Lösung für Datenbanken auf demselben Computer, und Google hat mich hierher gebracht. Ich bin dankbar für diese Antwort, auch wenn sie nicht im Zusammenhang mit der ursprünglichen Frage stand :)
Jason McCarrell

10

Ich habe eine PHP-Funktion geschrieben, die dies tun wird. Ich musste eine Einfügeanweisung abgeben, falls ein Datensatz nach dem Löschen für eine Verlaufstabelle ersetzt werden muss:

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

3
Diese Lösung ist ziemlich zerbrechlich. Wenn beispielsweise einer Ihrer Datensätze den Namen enthält O' Malley, weisen die generierten Abfragen Syntaxfehler auf, da nicht einfache Anführungszeichen übereinstimmen. Sie sollten zumindest verwenden, mysql_real_escape_stringwenn Sie diese Route gehen.
Eric Seastrand

immer noch nettes Zeug, ich werde es auf
jeden Fall

9

Der Code von Laptop Lift funktioniert gut, aber es gab ein paar Dinge, von denen ich dachte, dass sie den Leuten gefallen könnten.

Der Datenbankhandler ist ein Argument, das nicht fest codiert ist. Benutzte die neue MySQL-API. $ ID wurde durch ein optionales $ where-Argument für Flexibilität ersetzt. Verwendet real_escape_string für den Fall, dass jemand jemals versucht hat, eine SQL-Injektion durchzuführen und einfache Brüche mit Anführungszeichen zu vermeiden. Benutzte dieINSERT table (field...) VALUES (value...)... Syntax so, dass die Felder nur einmal definiert werden und dann nur die Werte jeder Zeile auflisten (implodieren ist fantastisch). Weil Nigel Johnson darauf hingewiesen hat, fügte ich hinzuNULL Handhabung .

Ich habe es benutzt, $array[$key]weil ich befürchtet hatte, es könnte sich irgendwie ändern, aber wenn etwas nicht schrecklich falsch ist, sollte es sowieso nicht.

<?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).";";
}
?>

Nicht sicher die fehlenden INTOauf , INSERT INTO {$tables}aber es gibt keinen Umgang mit NULL - Werte in der Tabelle.
Nigel Johnson

1
@NigelJohnson INTOist völlig optional . Ich habe die Behandlung von Nullen hinzugefügt.
Chinoto Vokro

6

Ich verwende das Programm SQLYOG, mit dem ich eine Auswahlabfrage durchführen, auf Bildschirmfotodie Ergebnisse zeigen und den Export als SQL auswählen kann. Dies gibt mir die Einfügeanweisungen.


Um Verwirrung zu vermeiden, heißt es im SQL-Format, aber es wird tatsächlich im MySQL-Format exportiert.
Kumar Vikramjeet

Danke .... +1 wie es bei mir funktioniert hat. Konnte aber nicht nur für ausgewählte Zeilen bekommen. :( Ihre Methode, die
Einfügeabfrage

5

Führen Sie in der MySQL-Werkbank Folgendes aus:

  1. Klicken Sie auf Server> Datenexport

  2. Wählen Sie auf der Registerkarte Objektauswahl das gewünschte Schema aus.

  3. Wählen Sie als Nächstes die gewünschten Tabellen im Listenfeld rechts neben dem Schema aus.

  4. Wählen Sie einen Dateispeicherort aus, um das Skript zu exportieren.

  5. Klicken Sie auf Fertig stellen.

  6. Navigieren Sie zu der neu erstellten Datei und kopieren Sie die Einfügeanweisungen.


Dies ist ein vollständiger Tabellenexport, kein Export einer bestimmten Zeile
Yehia

4

Wenn Sie eine "Anweisung einfügen" für Ihre Tabelle erhalten möchten, können Sie den folgenden Code ausprobieren.

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

Als Ergebnis erhalten Sie eine Inser-Erklärung:

INSERT INTO your_table( field_1, field_2, ...,field_n ) VALUES (value_11, value_12, ..., value_1n);

INSERT INTO your_table( field_1, field_2, ...,field_n ) VALUES (value_21, value_22, ..., value_2n);

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

INSERT INTO your_table( field_1, field_2, ...,field_n ) VALUES (value_m1, value_m2, ..., value_mn);

, wobei m - Anzahl der Datensätze in Ihrer_Tabelle


4
Könnten Sie Ihrer Antwort vielleicht etwas mehr als nur einen eingefügten Codeblock geben?
Matt Fletcher

Ja, aber das ist fest codiert. Feld_ * sind statische Namen. Es macht die Hälfte der Arbeit, und es macht es nicht so gut
Daniele Cruciani

warum GROUP_CONCAT?
Sealabr

3

Sie können Sequel Pro verwenden, um dies zu tun. Es gibt eine Option, um als Einfügeanweisung für die erhaltenen Ergebnisse zu erhalten


3

In PHPMyAdmin können Sie:

  1. Klicken Sie in der Zeile, in der Sie die Einfügeanweisungen wissen möchten, auf Kopieren. SQL:

Kopie auswählen

  1. Klicken Sie auf SQL-Vorschau:

Wählen Sie Vorschau

  1. Sie erhalten die erstellte insert-Anweisung, die sie generiert

Sie können dies auf viele Zeilen gleichzeitig anwenden, wenn Sie sie auswählen und unten in der Tabelle auf Kopieren und dann auf SQl-Vorschau klicken


Fügen Sie Ihrer Antwort weitere Erklärungen und Informationen hinzu
Ramin eghbalian

1

Mit PDO können Sie dies auf diese Weise tun.

$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

Sie können einen SP mit dem folgenden Code erstellen - er unterstützt auch 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

Für HeidiSQL-Benutzer :

Wenn Sie HeidiSQL verwenden, können Sie die Zeilen auswählen, für die Sie eine Einfügeanweisung erhalten möchten. Klicken Sie dann mit der rechten Maustaste> Rasterzeilen exportieren> wählen Sie "In Zwischenablage kopieren" für "Ausgabeziel", "Auswahl" für "Zeilenauswahl", damit Sie keine anderen Zeilen exportieren, "SQL INSERTs" für "Ausgabeformat"> Klicken Sie auf "OK".

Geben Sie hier die Bildbeschreibung ein

Die Anweisung insert befindet sich in Ihrer Zwischenablage.


0

Ich denke, dass die Antwort von Laptop Lifts am besten ist ... aber da niemand den Ansatz vorgeschlagen hat, den ich verwende, dachte ich mir, ich sollte mich einschalten. Ich verwende phpMyAdmin, um meine Datenbanken die meiste Zeit einzurichten und zu verwalten. Darin können Sie einfach Häkchen neben die gewünschten Zeilen setzen und unten auf "Exportieren" klicken und SQL auswählen. Sie erhalten INSERT-Anweisungen für die von Ihnen ausgewählten Datensätze. Hoffe das hilft.


-1

Basierend auf Ihren Kommentaren besteht Ihr Ziel darin, Datenbankänderungen von einer Entwicklungsumgebung in eine Produktionsumgebung zu migrieren.

Der beste Weg, dies zu tun, besteht darin, Ihre Datenbankänderungen in Ihrem Quellcode beizubehalten und sie folglich in Ihrem Quellcodeverwaltungssystem wie git oder svn zu verfolgen.

Mit so etwas können Sie schnell einsatzbereit sein: https://github.com/davejkiger/mysql-php-migrations

Als sehr einfache benutzerdefinierte Lösung in PHP können Sie eine Funktion wie die folgende verwenden:

function store_once($table, $unique_fields, $other_fields=array()) {
    $where = "";
    $values = array();
    foreach ($unique_fields as $k => $v) {
        if (!empty($where)) $where .= " && ";
        $where .= "$k=?";
        $values[] = $v;
    }
    $records = query("SELECT * FROM $table WHERE $where", $values);
    if (false == $records) {
        store($table, array_merge($unique_fields, $other_fields));
    }
}

Anschließend können Sie ein Migrationsskript erstellen, mit dem jede Umgebung auf Ihre Spezifikationen aktualisiert wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.