SQL – Update meerdere records in één query

Ik heb tabel – config.
Schema:
config_name | config_value

En ik wil graag meerdere records in één query bijwerken. Ik probeer het zo:

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

maar die vraag is verkeerd 🙁

Kun je me helpen?


Antwoord 1, autoriteit 100%

Probeer de syntaxis van de update voor meerdere 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 is de SQLFiddle-demo

of voorwaardelijke update

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 is de SQLFiddle-demo


Antwoord 2, autoriteit 86%

Je kunt het bereiken met INSERT zoals hieronder:

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

Hiermee worden nieuwe waarden in de tabel ingevoegd, maar als de primaire sleutel wordt gedupliceerd (reeds in de tabel ingevoegd), worden de door u opgegeven waarden bijgewerkt en wordt dezelfde record niet voor de tweede keer ingevoegd.


Antwoord 3, autoriteit 10%

in mijn geval moet ik de records bijwerken die meer dan 1000 zijn, hiervoor in plaats van elke keer dat ik dit verkies de update-query te raken,

  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 zijn de gebruikers-ID’s en voor die gebruikers-ID’s moet ik respectievelijk de base_id 999 en 88 bijwerken. Dit werkt voor mij.


Antwoord 4, autoriteit 5%

misschien is het voor iemand nuttig

voor Postgresql 9.5 werkt als een charme

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

deze SQL werkt het bestaande record bij en voegt een nieuw record toe (2 in 1)


Antwoord 5, autoriteit 5%

in plaats van dit

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

u kunt

. gebruiken

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

Antwoord 6, autoriteit 4%

De oplossing van Camille werkte. Veranderde het in een standaard PHP-functie, die de SQL-instructie schrijft. Ik hoop dat dit iemand anders helpt.

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

Antwoord 7, Autoriteit 3%

Voer de onderstaande code uit om N-Aantal rijen bij te werken, waar de ouder-ID de ID is, u wilt de gegevens van en kind-ID’s zijn de ID’s die u moet worden bijgewerkt, dus het is gewoon dat u de ouder-ID en het kind wilt toevoegen ID’s om alle rijen bij te werken die u nodig hebt via een klein script.

UPDATE [Table]
 SET column1 = (SELECT column1 FROM Table WHERE IDColumn = [PArent ID]),
     column2 = (SELECT column2 FROM Table WHERE IDColumn = [PArent ID]),
     column3 = (SELECT column3 FROM Table WHERE IDColumn = [PArent ID]),
     column4 = (SELECT column4 FROM Table WHERE IDColumn = [PArent ID]),
 WHERE IDColumn IN ([List of child Ids])

Antwoord 8, Autoriteit 2%

Aangenomen dat u de lijst met waarden hebt om bij te werken in een Excel-spreadsheet met Config_Value in kolom A1 en Config_Name In B1 U kunt eenvoudig de query ophalen met een Excel-formule zoals

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


Antwoord 9, Autoriteit 2%

Voer de onderstaande code uit als u alle record in alle kolommen wilt bijwerken:

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

en als u alle kolommen van een bepaalde rij wilt bijwerken, voert u onderstaande code uit:

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

Antwoord 10, Autoriteit 2%

INSERT INTO tablename
    (name, salary)
    VALUES 
        ('Bob', 1125),
        ('Jane', 1200),
        ('Frank', 1100),
        ('Susan', 1175),
        ('John', 1150)
        ON DUPLICATE KEY UPDATE salary = VALUES(salary);

Antwoord 11

Probeer multi-tabel updatesyntaxis

Probeer het kopiëren en SQL-query:

CREATE TABLE #temp (id int, name varchar(50))
CREATE TABLE #temp2 (id int, name varchar(50))
INSERT INTO #temp (id, name)
VALUES (1,'abc'), (2,'xyz'), (3,'mno'), (4,'abc')
INSERT INTO #temp2 (id, name) 
VALUES (2,'def'), (1,'mno1')
SELECT * FROM #temp
SELECT * FROM #temp2
UPDATE t
SET name = CASE WHEN t.id = t1.id THEN t1.name ELSE t.name END
FROM #temp t 
INNER JOIN #temp2 t1 on t.id = t1.id
select * from #temp
select * from #temp2
drop table #temp
drop table #temp2

Antwoord 12

Update 2021 / MySQL V8.0.20 en hoger

Het meest geüpvolle antwoord adviseert om de VALUES-functie te gebruiken die nu is verouderd voor de ON DUPLICATE KEY UPDATESyntaxis. Met V8.0.20 krijg je een afschrijvingswaarschuwing met de functie Waarden:

INSERT INTO chart (id, flag)
VALUES (1, 'FLAG_1'),(2, 'FLAG_2')
ON DUPLICATE KEY UPDATE id = VALUES(id), flag = VALUES(flag);

[HY000] [1287] ‘Waardenfunctie’ is verouderd en zal in een toekomstige release worden verwijderd. Gebruik alsjeblieft een alias (insert in … Waarden (…) als alias) en vervang waarden (Col) in de op duplicate sleutel update-clausule met alias.col in plaats daarvan

Gebruik in plaats daarvan de nieuwe alias-syntaxis:

INSERT INTO chart (id, flag) 
VALUES (1, 'FLAG_1'),(2, 'FLAG_2') AS aliased
ON DUPLICATE KEY UPDATE flag=aliased.flag;

Other episodes