MySQL UPDATE ステートメントの非標準実装コード

MySQL UPDATE ステートメントの非標準実装コード

今日は、MySQL データベースと SQL 標準 (および他のデータベース) の UPDATE ステートメントの違いを紹介します。この問題に注意を払わないと、予期しない結果につながる可能性があります。

まず、簡単なサンプル テーブルを作成しましょう。

テーブルt1を作成します(
 id int、 
 列1 int, 
 列2 int
); 

t1 値 (1, 1, 1) に挿入します。

t1から*を選択します。
id|列1|列2|
--|----|----|
 1| 1| 1|
————————————————
著作権声明: この記事は、CSDN ブロガー「髪を切らないトニー先生」によるオリジナル記事であり、CC 4.0 BY-SA 著作権契約に準拠しています。転載の際は、元のソース リンクとこの声明を添付してください。
オリジナルリンク: https://blog.csdn.net/horses/article/details/110238573CREATE TABLE t1(
 id int、 
 列1 int, 
 列2 int
); 

t1 値 (1, 1, 1) に挿入します。

t1から*を選択します。
id|列1|列2|
--|----|----|
 1| 1| 1|

次に、テーブル t1 のデータを更新します。

アップデート t1 
SET col1 = col1 + 1、
  列2 = 列1
ここで、id = 1;

列1、列2を選択 
t1から;

クエリ ステートメントによって返される col1 フィールドと col2 フィールドの結果は何ですか?

  • SQL 標準とその他のデータベース実装の場合、結果はそれぞれ21 になります。
  • しかし、MySQL では結果はそれぞれ22 になります。

MySQL の場合、UPDATE ステートメントが式 (col2 = col1) で以前に更新された列 (col1) を使用する場合、元の値 (1) の代わりに列の更新された値 (2) が使用されます。

MySQL でのこの実装は SQL 標準とは異なることに注意してください。また、実装が SQL 標準に準拠している Oracle、Microsoft SQL Server、PostgreSQL、SQLite などの他のデータベースもテストしました。

MySQL で標準 SQL と同じ効果を実現したい場合は、UPDATE ステートメントで更新されるフィールドの順序を調整できます。例えば:

アップデート t1 
SET col2 = col1、
  列1 = 列1 + 1
ここで、id = 1;

この方法では、col1 の古い値 (1) を使用して、col2 列が col1 の前に更新され、結果は SQL 標準と一致します。

結論: 一般に、UPDATE ステートメントを記述する場合、複数のフィールドの更新順序を気にする必要はありません。ただし、MySQL の実装の問題により、文法の順序に注意する必要があります。

これで、MySQL UPDATE ステートメントの非標準実装に関するこの記事は終了です。MySQL UPDATE ステートメントに関連する非標準コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 実用的な MySQL + PostgreSQL バッチ挿入更新 insertOrUpdate
  • MySQL 更新セットとの違い
  • mysql 更新ケース更新フィールド値が固定されていない操作
  • Mysql 更新マルチテーブル共同更新方法の概要
  • 更新とデータ整合性処理のためのMySQLトランザクション選択の説明
  • MySQL UPDATE ステートメントの「典型的な」落とし穴

<<:  シェルスクリプトは、Docker の半自動コンパイル、パッケージ化、およびリリースアプリケーション操作を構築します。

>>:  Vue は無限ロードウォーターフォールフローを実装します

推薦する

MYSQL は、指定されたユーザーのランキングとクエリを実装します。ランキング関数 (並列ランキング関数) のサンプルコード

序文この記事は主に、MYSQL でランキングを実現し、指定ユーザーランキング関数 (並列ランキング関...

Javascriptはセキュリティ検証に整合性属性を使用します

目次1. スクリプトタグを使用してファイルをインポートする1. ローカルファイルをインポートする2....

Linux の操作とメンテナンスの基本 httpd 静的 Web ページ チュートリアル

目次1. ウェアハウスを使用してhttpd lrzsz解凍ファイルを作成する2. ソースコードファイ...

mysql5.7.20 での最初のログイン失敗に対する簡単な解決策

まず、 (1)MySQL 5.7にはデフォルトのパスワードがあるデフォルトのパスワードを見つける g...

UDP 接続オブジェクトの原理分析と使用例

以前、UDP を使い始めるために簡単な UDP サーバーとクライアントの例を作成しましたが、実際に使...

役に立つメタ設定方法(必読)

<meta name="viewport" content="...

CSS3マスクレイヤーのくり抜き効果を実現するさまざまな方法

この記事では、マスク レイヤーの中空化を実現する 4 つの方法を紹介します。みんなと共有し、自分用の...

Docker の 4 つのネットワーク タイプの主な例

4 つのネットワーク タイプ:なし: コンテナのネットワーク機能を一切設定しません。--net=no...

Centos7 MySQL データベースのインストールと設定のチュートリアル

1. システム環境yum updateアップグレード後のシステムバージョンは[root@yl-web...

Reactでpropsを使用する方法と制限する方法

コンポーネントの props (props はオブジェクトです)機能: コンポーネントに渡されたデー...

MySQL ピボットテーブルについての簡単な説明

次のような製品部品表があります。一部 部品ID 部品タイプ 製品ID ---------------...

Linuxのアラーム機能の例の説明

Linuxアラーム機能の紹介上記のコード: #include <stdio.h> #in...

Node.js とブラウザのグローバル オブジェクトの違いの概要

Node.js では、.js ファイルは完全なスコープ (モジュール) です。したがって、var に...

MySQL データベースの最適化に関する 9 つのヒント

目次1. 最も適切なフィールド属性を選択する2. フィールドをNOT NULLに設定してみる3. サ...

jQuery キャンバスで画像検証コード例を描画する

この記事では、jQuery Canvasの描画画像検証コードの具体的なコードを例として紹介します。具...