web-dev-qa-db-fra.com

Mise à jour en masse de mysql avec l'instruction where

Comment mettre à jour des données mysql en bloc? Comment définir quelque chose comme ceci:

UPDATE `table` 
WHERE `column1` = somevalues
SET  `column2` = othervalues

avec certaines comme:

VALUES
    ('160009'),
    ('160010'),
    ('160011');

et autres valeurs:

VALUES
    ('val1'),
    ('val2'),
    ('val3');

peut-être que c'est impossible avec mysql? un script php?

21
user3673384

La solution la plus simple dans votre cas consiste à utiliser ON DUPLICATE KEY UPDATE construction. Cela fonctionne très vite et fait le travail facilement.

INSERT into `table` (id, fruit)
    VALUES (1, 'Apple'), (2, 'orange'), (3, 'Peach')
    ON DUPLICATE KEY UPDATE fruit = VALUES(fruit);

ou d'utiliser CASE construction

UPDATE table
SET column2 = (CASE column1 WHEN 1 THEN 'val1'
                 WHEN 2 THEN 'val2'
                 WHEN 3 THEN 'val3'
         END)
WHERE column1 IN(1, 2 ,3);
33
Farside

Si les données "en vrac" que vous avez sont dynamiques et proviennent de PHP (vous les avez taguées, après tout), la requête ressemblerait à ceci:

INSERT INTO `foo` (id, bar)
VALUES 
    (1, 'pineapple'),
    (2, 'asian pear'),
    (5, 'Peach')
ON DUPLICATE KEY UPDATE bar = VALUES(bar);

et le PHP pour le générer à partir d'un tableau existant (en supposant que le tableau ait le format suivant:

$array = (
    somevalues_key => othervalues_value
);

) ressemblerait à quelque chose comme ceci (en aucun cas le meilleur (par exemple, ne pas échapper ou effacer les valeurs), juste un exemple rapide):

$pairs = array();
foreach ($array as $key => $value) {
    $pairs[] = "($key, '$value')";
}

$query = "INSERT INTO `foo` (id, bar) VALUES " . implode(', ', $pairs) . " ON DUPLICATE KEY UPDATE bar = VALUES(bar)";
2
Davis

Vous pouvez utiliser implode pour mettre à jour en masse mysql avec l'instruction where 

$requete = $pdo->prepare("update table_name set field = 1 where id in(".implode(', ', $ids).")");
$requete->execute();

$ ids est un tableau

0
Houssin Boulla

Si vous avez des données au format tableau, essayez ceci

et votre requête est comme "UPDATE table WHERE column1 = ? SET column2 = ?"

puis réglez comme ci-dessous

foreach($data as $key => $value) {
    $query->bind_param('ss', $key, $value);
    $query->execute();
}

j'espère que ça va marcher.

Référence de this .

0
Virus