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

推薦する

Ubuntu で .sh ファイルを実行するいくつかの方法の違いについて簡単に説明します。

序文特に bash 環境では、スクリプトの実行方法によって結果が異なります。スクリプトを実行する方法...

Linuxはiptablesを使用して複数のIPからのサーバーへのアクセスを制限します

序文Linux カーネルでは、netfilter は、パケット フィルタリング、ネットワーク アドレ...

Vue 仮想 DOM クイックスタート

目次仮想DOM仮想DOMとは何か仮想DOMの役割Vue の仮想 DOM vノードvNodeとはvNo...

どのような種類の MYSQL 接続クエリを知っていますか?

序文クエリ情報が複数のテーブルから取得される場合、クエリのためにこれらのテーブルを結合する必要があり...

Tomcat でのサーブレットの作成と実装に関する深い理解

1. サーブレットとは何か1.1. 正式な言葉で説明する:サーブレットは、動的な Web リソースを...

アイデアコンパイラvueインデントエラー問題シナリオの分析

プロジェクトシナリオ: Vueプロジェクトを実行したらインデントエラーが出ました。ideaコンパイラ...

Vueはテーマ切り替えのための複数のアイデアを実装します

目次テーマを動的に変更する最初の方法: 動的コンポーネント2番目の方法はルーティング分離です要約する...

element-plus でオンデマンドインポートとグローバルインポートを実装する方法

目次オンデマンドインポート:グローバルインポートオンデマンドインポート:プラグインをインストールする...

指定フィールドによるMySQLカスタムリストのソートの実装

問題の説明ご存知のとおり、MySQL でフィールドを昇順に並べ替える SQL は次のとおりです (i...

Excel をインポートするときに js で時間を変換する正しい方法について

目次1. 基本2. 問題の説明3. 解決策付録: js を使用して Excel の日付形式を変換する...

MySQL公式エクスポートツールmysqlpumpの使用

目次導入説明書実際の経験長所と短所総括する導入mysqlpump は mysqldump の派生です...

開発効率の向上に役立つ 56 個の実用的な JavaScript ツール関数

目次1. デジタルオペレーション(1)指定された範囲内で乱数を生成する2. 配列操作(1)配列の順序...

MySQLインスタンスを安全にシャットダウンする方法

この記事では、mysqld プロセスをシャットダウンするプロセスと、MySQL インスタンスを安全か...

MySQL 集計統計データの低速クエリの最適化

前面に書かれた注文テーブル、アクセス記録テーブル、商品テーブルなど、日常生活でデータベースを操作する...

MySQL デッドロック シナリオ例の分析

序文最近、MySQL で RR レベルでデッドロック問題に遭遇しました。興味深いと思ったので、調べて...