MySQL では、UPDATE ステートメントを使用して 1 つ以上のテーブルのデータを変更および更新できます。次の記事は、MySQL での UPDATE の使用方法の詳細を調べるのに役立ちます。
最近、古いシステムのデータを新しいシステムに移行するためのデータ移行要件を受けました。旧システムでは移行できませんでした。業務データを再度追加し、新システムで業務を実行します。
移行による影響を軽減するため、データを一括で移行します。新しいシステムは一定期間並行して実行されます。
データは分割されます。バッチは ID 範囲に従って分割されません。つまり、データの各バッチの ID は不規則です。
さらに, 新旧システムのデータの対応を確実にするため、新システムのIDはできる限り旧システムのIDを使用します。古いシステムと新しいシステムでは、移行中に、次のように古いシステムの ID が新しいシステムで占有される可能性があります。
#要件の説明
このバッチを調整する方法ID の競合## はまさに私が今達成したいことです# 私の実装では、ビジネス データの増加と現在の新しいシステムの最大 ID に基づいて ID を事前に設定します。開始 ID
このSQL はどうやって書くのでしょうか?
要件の実現
投稿者は突然気づきました: 友人、あなたはとても素晴らしいです
しかし、競合するデータが多数 (数百または数千) ある場合、あなたも一つ一つ変えるの?あなたが本当にこれを行うなら、私はあなたを本当に尊敬します
もちろん、もっと賢明な友人がいるでしょうそれで、私は何をすべきでしょうか?達成?
投稿者はあまり面倒なことはしたくありません。これを実現するには、ローカル変数
UPDATE
を使用し、SQL ## に直接アクセスします。 # 実際のケースを見てみましょう
テーブル tbl_batch_update
# データは次のとおりです。次のように
実行効果は次のとおりです## アップデート後
## もっと厳密に
それを達成するにはどうすればよいでしょうか?
UPDATE はORDER
BY もサポートしますか? 以下に示すように、実際にサポートされています。 元の投稿者は通常 UPDATE を使用しますが、それを ORDER BY と組み合わせることはほとんどありません。 LIMIT と組み合わせたこの試みにより、作成者は UPDATE に慣れていないように感じました。完全な構文はどのようなものになるでしょうか?ゆっくり読んでいきましょう 以下はすべて MySQL 8.0 の公式ドキュメントに基づいています。 UPDATE ステートメント がコンパイルされているため、公式ドキュメントに直接アクセスすることをお勧めします たくさんの質問がありますか: ##単一テーブル構文と比較すると、Table は単純に見えますが、 ORDER BY および LIMIT UPDATE の修飾子の 1 つで、SQL の優先度を下げるために使用されます。 その後、UPDATE の実行は、他のクライアントがテーブルからデータを読み取らなくなるまで遅延されます ただし、テーブル レベルのみです。ロック ストレージ エンジンは のみをサポートします。テーブル レベルのロックのストレージ エンジンには、MyISAM、MEMORY、MERGE が含まれます。一般的に使用される InnoDB はサポートされていません # 使用シナリオはほとんどありませんが、見慣れたものだけです の修飾子の 1 つで、SQL が実行中にエラーを処理する方法を宣言するために使用されます IGNORE が使用されない場合、 UPDATE 実行中にエラーが発生した場合は、以下に示すように中止されます 9002 9003 が生成されると、主キーが競合し、UPDATE 全体が中止され、9000 が更新されます。成功した 9001 はロールバックされます、9003 ~ 9005 はまだ更新されていません。 IGNORE を使用するとどうなりますか? UPDATE 上記で返された影響を受ける行は 2 です。どの 2 つの行が変更されたのか教えていただけますか? IGNORE の詳細については、次を参照してください。 IGNORE がステートメントの実行に及ぼす影響 使用シナリオ、新旧システム間の並列処理について, データ移行を行うときに使用される可能性があります。主キーまたは一意キーが競合する場合は、 を無視してください。 実行プロセスを理解すると理解しやすくなります UPDATE 実際には 2 つのステージがあります: Check stage、 更新ステージ WHERE 句を満たす場合、行を更新します ORDER BY は、SELECT# の ORDER BY## と同じです。 同じ効果です # 使用シナリオに関しては、前述した需要の背景に戻って確認できます。 ケース 1 実際には、ORDER BY WHERE 句を満たす row_count 行が見つかると、行が実際に変更されたかどうかに関係なく、ステートメントは すぐに停止します。つまり、 LIMIT Check フェーズ に限定されており、Update フェーズ ##: # の構文には LIMIT との違いがあることに注意してください。 ##SELECT 値 DEFAULT 中 SET 句の value は式です。この DEFAULT# が何を意味するのか理解できます。 ## 平均? まずはそのような問題を見てみましょう。列が NOT NULL # に更新するとします。 ##NULL 何が起こるか### SQL_MODE を見て、SELECT @@sql_mode; を実行して結果を取得しましょう STRICT_TRANS_TABLES は、INSERT および UPDATE## に対して厳密モードが有効であることを示します。 # ステートメント value 制御がより厳密になります # 厳密モードをオフにして実行結果を見てみると #name NOT NULL になります。非厳密 SQL モードでは、name を次のように設定します。 NULL は成功しましたが、変更された値は NULL ではなく、タイプ VARCHAR# のデフォルト値です。 ## : 空の文字列 ('') 概要 1. 厳密な SQL モードでは、 NOT NULL フィールド設定が NULL の場合、エラーが直接報告され、更新は失敗します。 2. 非 厳密 SQL モードで、NOT NULL のフィールド設定が NULL の場合、フィールド値はフィールド タイプに設定されます。対応するデフォルト値 フィールド タイプのデフォルト値については、以下を表示できます。 データ タイプのデフォルト値 では、以下を表示できます: サーバー SQL モード 通常、生成環境 MySQL は通常、厳密モードであるため、このモードがあることを誰もが知っていれば十分です DEFAULT SET フィールドの順序 #誰もが非常に明確だと思います ただし、次の SQL name # 結果を見てみましょう name 単一テーブル UPDATE の SET は左から右に実行されますが、複数のテーブル UPDATE ただし、複数のテーブル UPDATE が特定の順序で処理されるとは限りません。概要 1. DELETE であっても、最初に確認してから処理するというプロセスがあります。見つかった各行 2. 構文 LOW_PRIORITY の UPDATE はほとんど使用されず、IGNORE は時々使用され、ORDER BY と LIMIT はより頻繁に使用され、どれも見慣れたものです 3. sql_mode の方が重要です 知識ポイントは誰でもマスターすることをお勧めします。運用環境では、厳密モードをオンにすることを強くお勧めします。 元のアドレス: https://www.cnblogs.com/youzhibing/p/16719474.html 著者: Qingshi Lu [関連する推奨事項: mysql ビデオ チュートリアル ]UPDATE
単一テーブル構文
##複数のテーブルの構文
UPDATE
#ORDER BY
#LIMIT row_count
句は行一致の制限です。 ##UPDATE
次の SQL
UPDATE であっても
以上がMySQL での UPDATE の使用法の詳細を詳しく調べるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。