web-dev-qa-db-ja.com

MySQL-LIMITを使用したUPDATEクエリ

テーブルの行を1001から次の1000までで更新したい。

私は次のクエリで試しました:

UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
  1. これにより、構文エラーが発生します。これは正しいです?ここで何か間違いをしていますか。
  2. この方法で更新を制限できますか?

また、更新しようとしている行のデータ型がINTEGERである列p_idのNull値があります。このため、次のクエリを使用して更新することさえできません。

UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null
  1. 上記のクエリは正しいですか?
  2. これを達成するために何ができますか?
56
srahul07

Nullを処理する場合、=はnull値と一致しません。 IS NULLまたはIS NOT NULLを使用できます

UPDATE `smartmeter_usage`.`users_reporting` 
SET panel_id = 3 WHERE panel_id IS NULL

LIMITUPDATEで使用できますが、row countのみで使用できます

24
Shakti Singh

MySQLの制限を使用して複数の行を更新する場合は、次の構成を使用できます。

UPDATE table_name SET name='test'
WHERE id IN (
    SELECT id FROM (
        SELECT id FROM table_name 
        ORDER BY id ASC  
        LIMIT 0, 10
    ) tmp
)
104
Roopchand

2段階のクエリをお勧めします

あなたはあなたのPKが(最大+1)であり、自動増加キーの定義のように聞こえると言うので、あなたは自動増加主キーを持っていると仮定しています。
PK idを呼び出しています。PKが呼び出されるものに置き換えます。

1-列1000の主キー番号を計算します。

SELECT @id:= id FROM smartmeter_usage LIMIT 1 OFFSET 1000

2-テーブルを更新します。

UPDATE smartmeter_usage.users_reporting SET panel_id = 3 
WHERE panel_id IS NULL AND id >= @id 
ORDER BY id 
LIMIT 1000

オフバイワンエラーを犯していないかどうかをテストしてください。どこかで1を加算または減算する必要がある場合があります。

8
Johan
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000

このクエリは正しくありません(または、少なくともUPDATEクエリで制限を使用する方法がわからない)、プライマリキーにwhere条件を設定する必要があります(これは、プライマリとしてauto_increment列があることを前提としています)キー、詳細を提供しない場合):

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE primary_key BETWEEN 1001 AND 2000

2番目のクエリでは、ISを使用する必要があります

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE panel_id is null

編集-primary_keyがMAX + 1という名前の列である場合、クエリは次のようになります(コメントに正しく記載されているように、逆ティックを使用)。

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE `MAX+1` BETWEEN 1001 AND 2000

MAX + 1で行を1001から2000(1001および2000を含む)に更新するには

3

LIMITとOFFSETではなく、LIMITでそれを行うことができます。

2
user945389

NULLと比較するには、=ではなくISを使用する必要があります。

UPDATE `smartmeter_usage`.`users_reporting`
SET panel_id = 3
WHERE panel_id IS null

MySQLのLIMIT句を更新に適用すると、オフセットの指定が許可されません。

1
Will A

上記のネストされたアプローチに加えて、同じテーブルでLIMITを使用してtheJOINの適用を実現できます。

UPDATE `table_name`
INNER JOIN (SELECT `id` from `table_name` order by `id` limit 0,100) as t2 using (`id`)
SET `name` = 'test'

私の経験では、mysqlクエリオプティマイザーはこの構造に満足しています。

1
Jerry

複数のテーブル構文でupdateに直面しているときにsafe update modeをオフにしないようにしようとする検索「MySQLの更新制限」でこの投稿を取得するユーザー向け。

公式文書 状態なので

複数テーブル構文の場合、UPDATEは、条件を満たすtable_referencesで指定された各テーブルの行を更新します。この場合、ORDER BYおよびLIMITは使用できません。

https://stackoverflow.com/a/28316067/1278112
この回答は非常に役立つと思います。例を挙げます

顧客の更新SET countryCode = 'USA' WHERE country = 'USA'; -エラーが発生するため、次のように記述します。

顧客の更新SET countryCode = 'USA' WHERE(country = 'USA' AND customerNumber <> 0); -customerNumberは主キーであるため、エラー1175は発生しません。

私が欲しいものですが、エラーコード1175が発生します。

UPDATE table1 t1
        INNER JOIN
    table2 t2 ON t1.name = t2.name 
SET 
    t1.column = t2.column
WHERE
    t1.name = t2.name;

ワーキングエディション

UPDATE table1 t1
        INNER JOIN
    table2 t2 ON t1.name = t2.name 
SET 
    t1.column = t2.column
WHERE
    (t1.name = t2.name and t1.prime_key !=0);

これは本当にシンプルでエレガントです。元の答えはあまり注目されないので(投票)、より多くの説明を投稿します。これが他の人を助けることを願っています。

0
Shihe Zhang

UPDATEを制限する場合は、ORDER BYの使用を検討する必要があります。そうしないと、テーブルの順序で更新され、正しくない可能性があります。

しかし、ウィルAが述べたように、row_countの制限のみを許可し、オフセットは許可しません。

0
jishi