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 アプリケーション

推薦する

HTML+CSSは、要素の位置までスクロールして読み込みアニメーション効果を表示します。

要素までスクロールするたびに読み込みアニメーションを追加するにはどうすればよいですか?初期パラメータ...

WeChatアプレットがSMS認証コード送信のカウントダウンを実装

この記事では、WeChatアプレットがSMS認証コードのカウントダウンを送信するための具体的なコード...

XHTML 入門チュートリアル: Web ページのヘッダーと DTD

ヘッドと DTD はページには表示されませんが、Web ページの重要な要素です。 なぜ失敗したのでし...

Tomcat を使用して Centos 環境に SpringBoot WAR パッケージをデプロイする

戦争パッケージを準備する1. 既存のSpringBootプロジェクトを準備し、pomに依存関係を追加...

MySQL COUNT関数の使用と最適化

目次COUNT 関数は何をするのですか? MyISAMの「魔法」シンプルなCOUNT最適化近似値を使...

Vue3.0のさまざまなリスニング方法の包括的な概要

目次リスナー1.ウォッチエフェクト2.見る1.1 聴くための最初の方法1.2 聞く2つ目の方法1.3...

Linux ファイル操作でよく使われるコマンドのまとめ

0. 新しい操作: mkdir abc #新しいフォルダを作成 touch abc.sh #新しいフ...

Linux で実行中のすべてのプロセスを表示する方法

ps コマンドを使用できます。プロセスの PID など、現在実行中のプロセスに関する関連情報を表示で...

HTML テーブル セルの幅と高さを設定する方法

Web ページを作成するときに、テーブルの幅が揃っていないという問題に遭遇することがよくあります。 ...

Hyper-V インストール CentOS 8 の問題の分析

CentOS 8 がリリースされてから随分経ちました。Linux 仮想マシンをいじっている人間として...

デザイン理論:フォントデザインの基礎

<br />言葉は、人間の思考や感情を伝えるために必然的に生み出されるものです。人類の文...

IE のテキストモード! DOCTYPE の役割の紹介

前の記事で説明したフォームの自動入力の問題を解決した後、新しい問題が発生しました。ページの一部のスタ...

Vue の基本的な手順の例のグラフィック説明

目次1. v-on指令1. 基本的な使い方2. 糖衣構文3. イベントパラメータ4. イベント修飾子...

MySQLでカンマ区切り値の列を列に変換する方法

序文場合によっては、第 1 正規形設計パターンに従わないビジネス テーブルに遭遇することがあります。...

VMware 15.5 バージョンのインストール Windows_Server_2008_R2 システム チュートリアル図

1. VMware 15.5から新しい仮想マシンを作成する1. VMware を開き、ホームページで...