web-dev-qa-db-ja.com

UPDATE 1行のみ(更新と結合を使用)

結合も使用しながら、一度に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の不適切な使用

5

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 でテストする

7
ypercubeᵀᴹ