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

推薦する

MySQLデータベースのマスタースレーブレプリケーションの長い遅延に対する解決策

序文MySQL マスター スレーブ レプリケーションの遅延は、業界では長年の問題となっています。遅延...

Vue でのテキストエリア適応高さソリューションの実装

目次隠れた問題適応高さのソリューションまず解決策を提示してください。Vueスタックが必要な学生はvu...

UbuntuにMySQLをインストールするときにデフォルトのパスワードを変更する詳細な手順

ステップ1: ディレクトリに入ります: cd /etc/mysql、debian.cnfファイルを表...

MySQL 8.0.12 のインストールと設定方法のグラフィックチュートリアル (Windows 版)

1. はじめにプロジェクトではMySQLを使用しています。インターネット上の例を参考にインストール...

HTML+CSS を使用して、画像の右上隅に削除の十字と画像削除ボタンを追加します。

記録として、将来使用される可能性があり、困っている友人も使用できます。 BBはもうやめて、まずはレン...

el-select のスタイルを変更する方法の詳細な説明: popper-append-to-body と popper-class

elementUI が提供する el-select コンポーネントのスタイルを変更する方法この問題...

MySQLはgroup_concat()関数に基づいて複数のデータ行を結合します

非常に便利な機能group_concat() について、マニュアルには次のように記載されています: ...

docker version es、milvus、minio 起動コマンドの詳細な説明

1. es起動コマンド: docker run -itd -e TAKE_FILE_OWNERSHI...

Linux ディスク パーティションの実装の原理と方法の分析

覚えて: IDE ディスク: 最初のディスクは hda、2 番目のディスクは hdb...最初のディ...

イントラネット侵入を実現するためのSSHポート転送

LAN 内のマシンは外部ネットワークにアクセスできますが、外部ネットワークは内部ネットワークにアクセ...

vue+elementuiは、共有箇条書きボックスの追加と変更の完全なコードを実装します。

目次1. 新しいII. 変更element-ui は、Ele.me のフロントエンド チームが開発者...

MySQL の完全なデータベース バックアップ データを使用して単一のテーブル データを復元する方法

序文データベースをバックアップするときは、データベース全体のバックアップを使用します。ただし、何らか...

jQuery+swiper コンポーネントはタイムラインのスライド年タブ切り替え効果を実現します

結果: 実装コード: スワイパーコンポーネントと一緒に使用する必要がありますSwiper 基本デモア...

MySQL インデックスの長さ制限の原理の分析

この記事は主に、MySQL インデックスの長さ制限の原理の分析を紹介します。サンプル コードを通じて...

MySQL 8.0 における MySQL のインストールと新しいパスワード認証方法の詳細な説明

1. はじめにOracle が MySQL 8.0GA をリリースしました。海外での GA はリリー...