SQL - Aktualisieren Sie mehrere Datensätze in einer Abfrage

132

Ich habe Tabelle - Konfiguration . Schema: config_name | config_value

Und ich möchte mehrere Datensätze in einer Abfrage aktualisieren. Ich versuche es so:

UPDATE config 
SET t1.config_value = 'value'
  , t2.config_value = 'value2' 
WHERE t1.config_name = 'name1' 
  AND t2.config_name = 'name2';

aber diese Abfrage ist falsch :(

Können Sie mir helfen?

user3022527
quelle
1
Welche Datenbank verwenden Sie?
Hart CO
Ich verwende die MySQL-Datenbank.
user3022527
Update von Select könnte die Antwort sein stackoverflow.com/questions/2334712/…
Jonathan Benn

Antworten:

167

Versuchen Sie es mit einer Update-Syntax für mehrere Tabellen

UPDATE config t1 JOIN config t2
    ON t1.config_name = 'name1' AND t2.config_name = 'name2'
   SET t1.config_value = 'value',
       t2.config_value = 'value2';

Hier ist die SQLFiddle- Demo

oder bedingte Aktualisierung

UPDATE config
   SET config_value = CASE config_name 
                      WHEN 'name1' THEN 'value' 
                      WHEN 'name2' THEN 'value2' 
                      ELSE config_value
                      END
 WHERE config_name IN('name1', 'name2');

Hier ist die SQLFiddle- Demo

peterm
quelle
1
Ja, das ist in Ordnung, aber was ist, wenn ich 16 Datensätze in einer Abfrage aktualisieren möchte? Ich soll JOIN x 16 verwenden?
user3022527
19
Sie sollten solche wichtigen Details in Ihrer Frage an erster Stelle erwähnen. Wie auch immer, siehe aktualisierte Antwort für eine andere Lösung (bedingte Aktualisierung).
Peterm
1
Was ist t1 und t2 in Ihren Beispielen?
Paul Brewczynski
1
Hallo auch an dich @PaulBrewczynski. Dies sind Tabellen - Aliases und kann geschrieben werden , config AS t1wo ist ASoptional.
Peterm
@peterm: Die SQLFiddle-Links sind fehlerhaft. Ansonsten funktioniert die bedingte Aktualisierungstechnik hervorragend. Vielen Dank!
Jonathan Benn
142

Sie können dies mit INSERT wie folgt erreichen:

INSERT INTO mytable (id, a, b, c)
VALUES (1, 'a1', 'b1', 'c1'),
(2, 'a2', 'b2', 'c2'),
(3, 'a3', 'b3', 'c3'),
(4, 'a4', 'b4', 'c4'),
(5, 'a5', 'b5', 'c5'),
(6, 'a6', 'b6', 'c6')
ON DUPLICATE KEY UPDATE id=VALUES(id),
a=VALUES(a),
b=VALUES(b),
c=VALUES(c);

Dadurch werden neue Werte in die Tabelle eingefügt. Wenn jedoch der Primärschlüssel dupliziert wird (bereits in die Tabelle eingefügt), werden die von Ihnen angegebenen Werte aktualisiert und derselbe Datensatz wird nicht zum zweiten Mal eingefügt.

camille khalaghi
quelle
26
ein ziemlich kluger Hack. Ich bin erstaunt.
Blaise
6
Nicht unterstützt für Postgres siehe: stackoverflow.com/questions/1109061/…
kevzettler
Es ist auch eine großartige Möglichkeit, ein wenig CSV (oder viel) mit geringfügiger Textbearbeitung in eine Tabelleneinfügung / -aktualisierung / -umfügung umzuwandeln!
Wulftone
6
Dies ist eine MySQL-Lösung, nicht Postgres oder MSSQL.
Rz Mk
1
Dies erhöht die Autoincrement-ID, auch wenn der Datensatz nicht eingefügt oder aktualisiert wird
Timo Huovinen
15

In meinem Fall muss ich die Datensätze aktualisieren, die mehr als 1000 sind, anstatt die Aktualisierungsabfrage jedes Mal zu treffen, wenn ich dies vorgezogen habe.

   UPDATE mst_users 
   SET base_id = CASE user_id 
   WHEN 78 THEN 999 
   WHEN 77 THEN 88 
   ELSE base_id END WHERE user_id IN(78, 77)

78,77 sind die Benutzer-IDs und für diese Benutzer-ID muss ich die base_id 999 bzw. 88 aktualisieren. Dies funktioniert für mich.

vaibhav kulkarni
quelle
Eines der besten hier, hat super für mich funktioniert.
Shahrukh Anwar
7

Vielleicht ist es für jemanden nützlich

für Postgresql 9.5 wirkt als Zauber

INSERT INTO tabelname(id, col2, col3, col4)
VALUES
    (1, 1, 1, 'text for col4'),
    (DEFAULT,1,4,'another text for col4')
ON CONFLICT (id) DO UPDATE SET
    col2 = EXCLUDED.col2,
    col3 = EXCLUDED.col3,
    col4 = EXCLUDED.col4

Diese SQL aktualisiert den vorhandenen Datensatz und fügt ihn ein, wenn ein neuer (2 in 1)

Oleg Sobchuk
quelle
1
Wie ich sehen kann, ist id gemäß Ihrer Abfrage pk für die Tabelle. Angenommen, es gibt zwei oder mehr Spalten, die als pk (zusammengesetzter Schlüssel) betrachtet werden. In diesem Fall sollte der Konflikt auf die richtige Weise überprüft werden.
Sritam Jagadev
6

Camilles Lösung hat funktioniert. Verwandelte es in eine grundlegende PHP-Funktion, die die SQL-Anweisung schreibt. Hoffe das hilft jemand anderem.

    function _bulk_sql_update_query($table, $array)
    {
        /*
         * Example:
        INSERT INTO mytable (id, a, b, c)
        VALUES (1, 'a1', 'b1', 'c1'),
        (2, 'a2', 'b2', 'c2'),
        (3, 'a3', 'b3', 'c3'),
        (4, 'a4', 'b4', 'c4'),
        (5, 'a5', 'b5', 'c5'),
        (6, 'a6', 'b6', 'c6')
        ON DUPLICATE KEY UPDATE id=VALUES(id),
        a=VALUES(a),
        b=VALUES(b),
        c=VALUES(c);
    */
        $sql = "";

        $columns = array_keys($array[0]);
        $columns_as_string = implode(', ', $columns);

        $sql .= "
      INSERT INTO $table
      (" . $columns_as_string . ")
      VALUES ";

        $len = count($array);
        foreach ($array as $index => $values) {
            $sql .= '("';
            $sql .= implode('", "', $array[$index]) . "\"";
            $sql .= ')';
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= "\nON DUPLICATE KEY UPDATE \n";

        $len = count($columns);
        foreach ($columns as $index => $column) {

            $sql .= "$column=VALUES($column)";
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= ";";

        return $sql;
    }
Adamk
quelle
5

an Stelle von

UPDATE staff SET salary = 1200 WHERE name = 'Bob';
UPDATE staff SET salary = 1200 WHERE name = 'Jane';
UPDATE staff SET salary = 1200 WHERE name = 'Frank';
UPDATE staff SET salary = 1200 WHERE name = 'Susan';
UPDATE staff SET salary = 1200 WHERE name = 'John';

Sie können verwenden

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');
Shuhad Zaman
quelle
3

Führen Sie den folgenden Code aus, um n Zeilen zu aktualisieren, wobei die übergeordnete ID die ID ist, von der Sie die Daten abrufen möchten, und die untergeordneten IDs die IDs sind, die aktualisiert werden müssen. Sie müssen also nur die übergeordnete ID und die untergeordneten IDs zum Aktualisieren hinzufügen Alle Zeilen, die Sie benötigen, verwenden ein kleines Skript.

    UPDATE [Table]
 SET couloumn1= (select couloumn1 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn2= (select couloumn2 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn3= (select couloumn3 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn4= (select couloumn4 FROM Table WHERE IDCouloumn = [PArent ID]),
 WHERE IDCouloumn IN ([List of child Ids])
Harrish Selvarajah
quelle
2

Angenommen, Sie haben die Liste der zu aktualisierenden Werte in einer Excel-Tabelle mit config_value in Spalte A1 und config_name in B1 , können Sie die Abfrage dort einfach mit einer Excel-Formel wie schreiben

=CONCAT("UPDATE config SET config_value = ","'",A1,"'", " WHERE config_name = ","'",B1,"'")

Ivar
quelle
1

Führen Sie den folgenden Code aus, wenn Sie alle Datensätze in allen Spalten aktualisieren möchten:

update config set column1='value',column2='value'...columnN='value';

Wenn Sie alle Spalten einer bestimmten Zeile aktualisieren möchten, führen Sie den folgenden Code aus:

update config set column1='value',column2='value'...columnN='value' where column1='value'
Jason Clark
quelle
3
Was ist, wenn unterschiedlicher Wert in unterschiedlicher Zeile? Zum Beispiel UPDATE Mitarbeiter SET Gehalt = 1125 WHERE Name = 'Bob'; UPDATE Mitarbeiter SET Gehalt = 1200 WHERE Name = 'Jane'; UPDATE Mitarbeiter SET Gehalt = 1100 WHERE Name = 'Frank'; UPDATE Mitarbeiter SET Gehalt = 1175 WHERE Name = 'Susan'; UPDATE Mitarbeiter SET Gehalt = 1150 WHERE Name = 'John';
Abdullah Nurum