webentwicklung-frage-antwort-db.com.de

MYSQL: Wie kopiere ich eine ganze Zeile von einer Tabelle in eine andere in Mysql, wobei die zweite Tabelle eine zusätzliche Spalte hat?

Ich habe zwei Tabellen mit identischer Struktur mit Ausnahme einer Spalte ... Tabelle 2 hat die zusätzliche Spalte, in die ich das CURRENT_DATE () einfügen würde.

Ich möchte alle Werte von table1 nach table2 kopieren.

wenn ich benutze

INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;

es wird ein Fehler ausgegeben, der auf den Unterschied in der Spaltenanzahl hinweist. 

Ich habe zwei Fragen dazu:

  1. Wie komme ich dazu?
  2. und wie füge ich den Wert für die zusätzliche Datumsspalte (CURRENT_DATE ()) in table2 in derselben Anweisung hinzu?
69
user165242

Um die Antwort von Zed zu verfeinern und Ihren Kommentar zu beantworten:

INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;

Siehe T.J. Crowder's Kommentar

84
crunchdog

Am sichersten ist es, die Spalten sowohl für das Einfügen als auch für das Extrahieren vollständig anzugeben. Es gibt keine Garantie (für die Anwendung), dass diese Reihenfolge in der Reihenfolge liegt, in der Sie sie für wahrscheinlich halten.

insert into dues_storage (f1, f2, f3, cd)
    select f1, f2, f3, current_date() from dues where id = 5;

Wenn Sie befürchten, viele PHP -Seiten ändern zu müssen, die dies tun (wie Sie in dem Kommentar auf eine andere Antwort angeben möchten), ist dies für eine gespeicherte Prozedur ausreichend. Auf diese Weise rufen alle Ihre PHP - Seiten einfach die gespeicherte Prozedur mit (zum Beispiel) nur der zu kopierenden ID auf und steuern den eigentlichen Kopiervorgang. Auf diese Weise gibt es nur einen Ort, an dem Sie den Code pflegen müssen, und meiner Meinung nach ist das DBMS der richtige Ort dafür.

48
paxdiablo
INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;
8
Zed

Ich hoffe, dass dies jemandem helfen wird. Hier ist ein kleines PHP - Skript, das ich geschrieben habe, falls Sie einige Spalten kopieren müssen, andere jedoch nicht und/oder die Spalten in beiden Tabellen nicht in derselben Reihenfolge sind. Solange die Spalten gleich benannt sind, funktioniert dies. Wenn also Tabelle A [Benutzer-ID, Handle, etwas] hat und tableB [Benutzer-ID, Handle, Zeitstempel] hat, dann würden Sie "Benutzer-ID, Handle, JETZT () als Zeitstempel FROM tableA" wählen, und dann das Ergebnis und Übergeben Sie das Ergebnis als ersten Parameter an diese Funktion ($ z). $ toTable ist ein String-Name für die Tabelle, in die Sie kopieren, und $ link_identifier ist die Datenbank, in die Sie kopieren. Dies ist für kleine Datensätze relativ schnell. Es wird nicht empfohlen, dass Sie versuchen, in einer Produktionseinstellung auf diese Weise mehr als ein paar tausend Zeilen gleichzeitig zu verschieben. Ich verwende dies hauptsächlich, um Daten zu sichern, die während einer Sitzung erfasst wurden, wenn sich ein Benutzer abmeldet, und dann sofort die Daten aus der Live-Datenbank zu löschen, um sie schlank zu halten.

 function mysql_multirow_copy($z,$toTable,$link_identifier) {
            $fields = "";
            for ($i=0;$i<mysql_num_fields($z);$i++) {
                if ($i>0) {
                    $fields .= ",";
                }
                $fields .= mysql_field_name($z,$i);
            }
            $q = "INSERT INTO $toTable ($fields) VALUES";
            $c = 0;
            mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. !
            while ($a = mysql_fetch_assoc($z)) {
                foreach ($a as $key=>$as) {
                    $a[$key] = addslashes($as);
                    next ($a);
                }
                if ($c>0) {
                    $q .= ",";
                }
                $q .= "('".implode(array_values($a),"','")."')";
                $c++;
            }
            $q .= ";";
            $z = mysql_query($q,$link_identifier);
            return ($q);
        }
4
Josh Strike
SET @sql = 
CONCAT( 'INSERT INTO <table_name> (', 
    (
        SELECT GROUP_CONCAT( CONCAT('`',COLUMN_NAME,'`') ) 
            FROM information_schema.columns 
            WHERE table_schema = <database_name>
                AND table_name = <table_name>
                AND column_name NOT IN ('id')
    ), ') SELECT ', 
    ( 
        SELECT GROUP_CONCAT(CONCAT('`',COLUMN_NAME,'`')) 
        FROM information_schema.columns 
        WHERE table_schema = <database_name>
            AND table_name = <table_source_name>
            AND column_name NOT IN ('id')  
    ),' from <table_source_name> WHERE <testcolumn> = <testvalue>' );  

PREPARE stmt1 FROM @sql; 
execute stmt1;

Ersetzen Sie natürlich <> Werte durch echte Werte und achten Sie auf Ihre Angebote.

0
Joomsavvy

Alternativ können Sie dazu Inner Queries verwenden.

SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>);

Hoffe das hilft!

0
Prasheel