web-dev-qa-db-fra.com

MISE À JOUR Une seule ligne (en utilisant la mise à jour et la jointure)

J'essaie d'obtenir une requête SQL simple et rapide pour mettre à jour une seule ligne à la fois tout en utilisant Join.

J'ai essayé LIMIT, mais sans succès.

Requete:

UPDATE
table1
JOIN
table2 ON table2.col=table1.col
SET 
table1.row1='a value'
WHERE
table1.row2 LIKE '%something%' 
LIMIT 1

Message:

Code d'erreur: 1221. Utilisation incorrecte de UPDATE et LIMIT

5

LIMIT n'est pas autorisé lorsque UPDATE a des jointures. Vous pouvez cependant déplacer la jointure et le LIMIT à l'intérieur d'une sous-requête, puis rejoindre la table à mettre à jour à l'aide de la clé primaire ou unique. Ceci est autorisé:

UPDATE table1 AS upd
  JOIN
    ( SELECT t1.pk
      FROM table1 AS t1
        JOIN
           table2 AS t2 ON t2.col = t1.col
      WHERE t1.row2 LIKE '%something%' 
      -- ORDER BY some_expressions
      LIMIT 1
    ) AS sel
    ON sel.pk = upd.pk
SET 
   upd.row1 = 'a value' ;

Il est également bon d'utiliser ORDER BY avec LIMIT. Sinon, une ligne arbitraire sera sélectionnée.


Si vous souhaitez mettre à jour les deux tables (une ligne de chacune), il vous suffit également de joindre la table dérivée à la deuxième table:

UPDATE 
    ( SELECT t1.pk AS pk1,                     -- The PK columns 
             t2.pk AS pk2                      -- of each table
      FROM table1 AS t1
        JOIN
           table2 AS t2 ON t2.col = t1.col
      WHERE t1.row2 LIKE '%something%' 
      -- ORDER BY some_expressions
      LIMIT 1
    ) AS sel
  JOIN table1 AS upd1  ON sel.pk1 = upd1.pk    -- join table1    
  JOIN table2 AS upd2  ON sel.pk2 = upd2.pk    -- join table2
SET 
   upd1.row1 = 'a value',
   upd2.roww = 'some other value' ;

Testez sur rextester.com

7
ypercubeᵀᴹ