2010-06-29 3 views
1

J'ai besoin de mettre à jour plusieurs lignes avec une requête. Pour l'insert que nous faisons quelque chose commeComment mettre à jour plusieurs lignes avec une requête (perl-mysql)?

INSERT INTO `table` (c1,c2,c3) VALUES 
(1,2,3), 
(4,5,6), 
.. 

Mais comment pouvons-nous faire quelque chose de similaire pour la mise à jour où chaque ligne a des valeurs différentes que l'autre? Et il y a une condition qui est liée à l'id de chaque rangée?

Quelqu'un at-il fait face à un problème similaire?

Exemple de la façon dont je dois faire la mise à jour est maintenant:

UPDATE questions 
SET lab='What sections do you believe the site must not have?', 
    type='textarea', 
    options='' 
WHERE rnum=11; 

UPDATE questions 
SET lab='What is your favourate section?', 
    type='radio', 
    options='section1,section2,section3,section4,section5' 
WHERE rnum=12; 

Et ainsi de suite. Certainement c'est la pire façon de le faire parce que chaque requête doit être exécutée, et il peut y avoir jusqu'à 20.

Répondre

0

Avec le temps, j'ai trouvé une meilleure façon de le faire, et par une requête, au lieu d'utiliser une boucle for. L'idée est d'utiliser insert sur une mise à jour en double et de mettre la clé d'enregistrement sur l'insert, ce qui forcera la requête à faire une mise à jour.

INSERT INTO table_name 
          (key, a, b) 
          VALUES 
          (1,'apple','orange'), 
          (2,'xyz','abc') 
          ON DUPLICATE KEY 
          UPDATE 
          a= VALUES(a), 
          b= VALUES(b) 
0

Considérons, par exemple, qu'elle incrémente toutes les valeurs de la colonne 'col_name' dont id> 5 et col_name pas 0

id col_name 
1  1 
5  2 
6  3 
7  5 
8  6 
9  7 
10  0 

Recherche

update tbl_name SET col_name=col_name+1 where id > 5 and col_name !=0 

O/P sera

id col_name 
1  1 
5  2 
6  4 
7  6 
8  7 
9  8 
10  0 
+0

désolé pourtant ce n'est pas ce que je demande à propos de. Merci. – Luci

+0

Non, vous ne pouvez pas le faire ce que vous voulez en utilisant une seule requête. – Salil

0

I f vous mettre à jour une table avec des valeurs d'une autre table, il est facile:

update table1,table2 
SET table1.value = table2.value 
WHERE table1.key = table2_foreign_key 

Si vous mettez à jour une table en changeant un sous-ensemble de lignes d'une manière cohérente, il est facile:

update table1 
SET table1.value = (table1.value * 2) 
WHERE table1.id in (SELECT id from table1 where table1.key > 50); 

Si vous essayez de mettre à jour plusieurs enregistrements dans une table où chaque enregistrement est mis à jour différemment, sans en utilisant une deuxième table, c'est fondamentalement impossible. Mieux vaut le faire dans votre code.

4

En utilisant des espaces réservés, vous pouvez le faire avec de nombreuses exécutions de la même requête:

my @data = (
    [ 'new_lab1', 'new_type1', 'new_opt1', 1 ], 
    [ 'new_lab2', 'new_type2', 'new_opt2', 2 ], 
); 

my $sql = <<EOT; 
UPDATE questions 
SET lab=?, 
    type=?, 
    options=? 
WHERE rnum=? 
EOT 

my $sth = $dbh->prepare($sql); 
for my $datum (@data) { 
    $sth->execute(@$datum); 
} 
1

D'abord, pourquoi avez-vous besoin de le faire dans une requête? Si vous avez besoin des mises à jour effectuées de manière atomique, pouvez-vous les envelopper dans un START TRANSACTION; et COMMIT;? C'est probablement ce que je ferais. Cependant, si vous en avez vraiment besoin dans une requête, et que le nombre de lignes que vous mettez à jour est raisonnablement petit, cela peut être fait! Vous pouvez probablement utiliser ce petit truc laid:

UPDATE questions 
SET 
lab = IF(rnum=11, 'What sections...?', 
     IF(rnum=12, 'What is your...?', 
      IF(rnum=13, 'Etc.', 
      NULL 
     ) 
     ) 
    ), 
type = IF(rnum=11, 'textarea', 
     IF(rnum=12, 'radio', 
      IF(rnum=13, 'Etc.', 
      NULL 
      ) 
     ) 
     ) 
WHERE rnum IN (11, 12, 13); 

écriture la boucle en Perl pour construire ce monstre de la nature est laissée en exercice :)

Si vous écrivez correctement et si la table est que vous crois, ces restes NULL ne devraient jamais être utilisés. Pour plus de sécurité, vous pouvez déclarer certaines de ces colonnes comme étant NOT NULL, si vous le pouvez, de sorte que si votre rnum ne correspond pas, l'affectation entraînera l'échec de la contrainte et le UPDATE sera abandonné.

Questions connexes