MySQL が暗黙のデフォルト値を処理する方法

MySQL が暗黙のデフォルト値を処理する方法

何人かの学生は、マスターとスレーブの間の不一致の問題に遭遇したと述べました。

一般的な状況としては、mysqldump を使用してデータをエクスポートおよびインポートすることによってスレーブ データベースが作成されます。作成が成功した後、mysqldump を使用してマスターとスレーブのテーブル構造が一貫しているかどうかを確認すると、一部のテーブル定義に不一致があることがわかります。

比較結果から、スレーブ側では 3 つの列の定義に「デフォルト null」が追加されていることがわかります。

誰かが環境を変更したのではないかと疑っていましたが、最終的には環境が改ざんされていないことが確認できました。次に、mysqldump を使用してデータをエクスポートし、source を使用してデータをスレーブ データベースにインポートする別のテストを実行しました。この現象がまだ発生することがわかったので、source コマンドにバグがあるかどうかを尋ねました。

実際、これは MySQL が暗黙のデフォルト値を内部的に処理する方法に関係しています。

データ型に明示的なデフォルト値が含まれていない場合、MySQL は次の規則に従ってデフォルト値を決定します。
列が NULL 値を取ることができる場合、明示的なデフォルト NULL 句が列定義に追加されます。列が NULL 値を取ることができない場合、明示的なデフォルト句は列定義に追加されません。

明示的な DEFAULT 句なしで NOT NULL 列にデータが入力された場合、 INSERT または REPLACE ステートメントに列の値が含まれていない場合、または UPDATE ステートメントによって列が NULL に設定される場合、MySQL は有効な SQL モードに従って列を処理します。
厳密な SQL モードが有効になっている場合、トランザクション テーブルでエラーが発生し、ステートメントがロールバックされます。非トランザクション テーブルの場合、エラーが発生しますが、このエラーが複数行ステートメントの 2 行目以降で発生した場合、エラーの前のすべての行はすでに挿入されています。
厳密モードが有効になっていない場合、MySQL は列を列データ型の暗黙的なデフォルト値に設定します。

テーブル t が次のように定義されていると仮定します。

mysql> テーブル t(i int not null) を作成します。

ここで、i には明示的なデフォルト値はありません。
厳密な SQL モードでは、次のステートメントはエラーを生成し、挿入は失敗します。

mysql> '%sql_mode%' のような変数を表示します。
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 変数名 | 値 |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
セット内の1行(0.01秒)

 mysql> t VALUES() に INSERT INTO します。
エラー 1364 (HY000): フィールド 'i' にデフォルト値がありません
mysql> t VALUES(DEFAULT) に INSERT INTO します。
エラー 1364 (HY000): フィールド 'i' にデフォルト値がありません
mysql> t VALUES(DEFAULT(i)) に INSERT INTO します。
エラー 1364 (HY000): フィールド 'i' にデフォルト値がありません
マイSQL>

非厳密な SQL モードの場合:

mysql> @@sql_mode を設定します。
クエリは正常、影響を受けた行は 0 行、警告は 1 件 (0.00 秒)

 mysql> '%sql_mode%' のような変数を表示します。
+---------------+-------+
| 変数名 | 値 |
+---------------+-------+
| SQL モード | |
+---------------+-------+
セット内の 1 行 (0.00 秒)

 mysql> t VALUES() に INSERT INTO します。
クエリは正常、1 行が影響を受け、1 つの警告 (0.00 秒)

 mysql> t VALUES(DEFAULT) に INSERT INTO します。
クエリは正常、1 行が影響を受け、1 つの警告 (0.01 秒)

 mysql> t VALUES(DEFAULT(i)) に INSERT INTO します。
エラー 1364 (HY000): フィールド 'i' にデフォルト値がありません
mysql> t から * を選択します。
+---+
| 私 |
+---+
| 0 |
| 0 |
+---+
セットに2行(0.01秒)

 マイSQL>

特定のテーブルの場合、SHOW CREATE TABLE ステートメントは、明示的な DEFAULT 句を持つ列を表示します。暗黙のデフォルト値は次のように定義されます。
数値型の場合、デフォルトは 0 ですが、AUTO_INCREMENT 属性で宣言された整数型または浮動小数点型の場合、デフォルトはシーケンス内の次の値になります。
TIMESTAMP 以外の日付と時刻の型の場合、デフォルト値はその型の「ゼロ」値になります。 expressly_defaults_for_timestamp システム変数が有効になっている場合は、TIMESTAMP についても同様です。それ以外の場合、テーブルの最初の TIMESTAMP 列のデフォルトは現在の日付と時刻になります。
ENUM 以外の文字列型の場合、デフォルト値は空の文字列になります。 ENUM の場合、デフォルト値は最初の列挙値です。

mysql> テーブル t1(id int,name varchar(20)) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.04 秒)

 mysql> テーブル t1\G の作成を表示します
************************** 1. 行 ****************************
       表: t1
テーブルの作成: CREATE TABLE `t1` (
  `id` int(11) デフォルト NULL,
  `name` varchar(20) デフォルト NULL
) エンジン=InnoDB デフォルト文字セット=utf8mb4
セット内の 1 行 (0.00 秒)

 マイSQL>

上記は、MySQL が暗黙のデフォルト値を処理する方法の詳細です。MySQL の暗黙のデフォルト値の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLクエリ時にフィールドにデフォルト値を割り当てる方法
  • Mysql データベースの日付と日時型でデフォルト値 0000-00-00 を設定するときに発生するエラー問題の詳細な説明
  • MySQL 5.7 の sql_mode のデフォルト値によって生じる落とし穴と解決策
  • MySQL で datetime 型のデフォルト値を設定する方法
  • MySQL コマンドラインでテーブルにフィールドを追加します (フィールド名、空かどうか、デフォルト値)
  • Mysql の select ステートメントでデフォルト値を設定する方法
  • MySQLで現在の時刻をデフォルト値として設定する方法を分析する
  • MySQL テーブル フィールドのデフォルト値の設定 (グラフィック チュートリアルと詳細に注意)
  • MySQL 5.6 の「暗黙的な変換」によりインデックスが失敗し、データが不正確になる
  • MySQLの暗黙的な変換問題の解決
  • MySQLの暗黙的な型変換の概要

<<:  Docker デプロイメント Consul 構成プロセスの分析

>>:  innerHTML アプリケーション

推薦する

Baota LinuxパネルにFTP接続できない問題の解決方法の詳細な説明

Alibaba Cloud Server を使用している場合は、セキュリティ グループ設定でポート ...

Vue3のいくつかの利点についての簡単な説明

目次1. ソースコード1.1 モノレポ1.2 タイプスクリプト2. パフォーマンス2.1 ソースコー...

DockerでSpringbootプロジェクトを実行する方法

1. IDEAの下にあるターミナルをクリックし、mvn clean installと入力します。 次...

WeChatアプレットが複数行テキストのスクロール効果を実現

この記事の例では、WeChatアプレットで複数行のテキストスクロールを実装するための具体的なコードを...

MySQL 文字セットの変更に関する実践的なチュートリアル

序文: MySQL では、システムが多くの文字セットをサポートしており、異なる文字セット間にはわずか...

Vue Routerはバックグラウンドデータに応じて異なるコンポーネントをロードします

目次実際のプロジェクトで遭遇する要件実装が間違っているところもある私は個人的に、実装するより良い方法...

CSS の高度な使い方(実戦で活用)

1. ul タグには、Mozilla ではデフォルトでパディング値がありますが、IE ではマージン値...

Xftp のダウンロードとインストールのチュートリアル (グラフィック チュートリアル)

Windows と Linux 間でファイルを転送する場合は、Xftp ツールを使用できます。この...

MySQL マスタースレーブ遅延問題の解決方法

今日は、マスタースレーブ遅延が発生する理由とその対処方法について説明します。しっかり座って出発の準備...

JavaScript配列の一般的なメソッドの概要

目次1. はじめに2. フィルター() 3. マップ() 4. ソート() 5. 減らす() 6. ...

Web 開発チュートリアル クロスドメイン ソリューションの詳細な説明

序文この記事では、主にWeb開発のためのクロスドメインソリューションを紹介し、参考と学習のために共有...

ハイパーコネクションの4つの状態の適用の詳細な説明

ブラウザの問題かもしれないと思うかもしれませんが、スタイル定義の順序が間違っている可能性が高いです。...

Windows Server 2016 に Oracle をインストールする方法

1. Oracle をインストールします。インターネット上には Oracle のインストール手順が多...

VM VirtualBox 仮想マシンのマウント共有フォルダ

一つの環境CentOS 7にVMware Toolsをインストールしてホストの共有フォルダへのアクセ...

NginxはIP経由の直接アクセスを禁止し、カスタム500ページにリダイレクトします

設定ファイルに直接 サーバー{ listen 80 default; # IPへの直接アクセスを禁止...