結合も使用しながら、一度に1行だけを更新する高速で単純なSQLクエリを取得しようとしています。
私はLIMIT
を試しましたが、成功しませんでした。
クエリ:
UPDATE
table1
JOIN
table2 ON table2.col=table1.col
SET
table1.row1='a value'
WHERE
table1.row2 LIKE '%something%'
LIMIT 1
メッセージ:
エラーコード:1221。UPDATEおよびLIMITの不適切な使用
LIMIT
は、UPDATE
が結合している場合は許可されません。ただし、サブクエリ内で結合とLIMIT
を移動してから、テーブルに結合して、主キーまたは一意のキーを使用して更新できます。これは許可されています:
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' ;
LIMIT
とともにORDER BY
を使用するのも良い方法です。それ以外の場合は、任意の行が選択されます。
両方のテーブルを更新する場合(各行から1行ずつ)、派生テーブルを2番目のテーブルにも結合する必要があります。
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' ;
rextester.com でテストする