Page 1 sur 1

Update sur plusieurs tables

Posté : 27 mai 2010, 15:21
par albius
Bonjour,

J'ai une donnée qui a été changée une première fois avec une requête classique dans une table:
UPDATE produits
 SET designation= "'.$prod.'", ...
WHERE idPdts = "'.$idProd.'"'// $idProd étant l\'ancienne donnée
J'aimerais maintenant répéter cette modification sur plusieurs tables à la fois, mais je ne vois pas trop comment faire. D'après la documentation, il faudrait la présence d'un champ commun entre les tables. Mais dans mon cas, ce champs (du nom de 'designation') n'est pas une clef primaire
UPDATE commandes AS c, admincom AS a, boncommandes AS b
 SET... ?
merci,

Re: Update sur plusieurs tables

Posté : 27 mai 2010, 17:14
par mojorisin
Bonjour,
vous pouvez utiliser une jointure dans votre update comme une jointure de requete select. Cette jointure n'est pas obligé de se référer au champ a mettre à jour.

Exemple sur la structure suivante :
CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Contenu de la table `table1`
--

INSERT INTO `table1` (`id`, `description`) VALUES
(1, 'description table 1');


CREATE TABLE IF NOT EXISTS `table2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_table1` int(11) NOT NULL,
  `description` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id_table1` (`id_table1`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
INSERT INTO `table2` (`id`, `id_table1`, `description`) VALUES
(1, 1, 'description table 2');
La jointure se fera sur table1.id=table2.id_table1 :
UPDATE 
    table1,table2 
SET 
    table1.description = "new desc",
    table2.description = "new desc" 
WHERE 
    table1.id =1 
AND 
    table1.id = table2.id_table1;

update table1 INNER JOIN table2 ON(table1.id=table2.id_table1)
set
table1.description="description inner join",
table2.description="description inner join"
WHERE 
table1.id=1

Re: Update sur plusieurs tables

Posté : 28 mai 2010, 09:13
par albius
Ok, merci bien. Je vais étudier ça...