テーブルの行を1001から次の1000までで更新したい。
私は次のクエリで試しました:
UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
また、更新しようとしている行のデータ型がINTEGERである列p_idのNull値があります。このため、次のクエリを使用して更新することさえできません。
UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null
Nullを処理する場合、=
はnull値と一致しません。 IS NULL
またはIS NOT NULL
を使用できます
UPDATE `smartmeter_usage`.`users_reporting`
SET panel_id = 3 WHERE panel_id IS NULL
LIMIT
はUPDATE
で使用できますが、row count
のみで使用できます
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
)
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を加算または減算する必要がある場合があります。
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を含む)に更新するには
LIMITとOFFSETではなく、LIMITでそれを行うことができます。
NULLと比較するには、=ではなくISを使用する必要があります。
UPDATE `smartmeter_usage`.`users_reporting`
SET panel_id = 3
WHERE panel_id IS null
MySQLのLIMIT
句を更新に適用すると、オフセットの指定が許可されません。
上記のネストされたアプローチに加えて、同じテーブルで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クエリオプティマイザーはこの構造に満足しています。
複数のテーブル構文で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);
これは本当にシンプルでエレガントです。元の答えはあまり注目されないので(投票)、より多くの説明を投稿します。これが他の人を助けることを願っています。
UPDATEを制限する場合は、ORDER BY
の使用を検討する必要があります。そうしないと、テーブルの順序で更新され、正しくない可能性があります。
しかし、ウィルAが述べたように、row_countの制限のみを許可し、オフセットは許可しません。