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