ホームページ > データベース > mysql チュートリアル > MySQL 8.0 タイムスタンプによって引き起こされる問題の共有例

MySQL 8.0 タイムスタンプによって引き起こされる問題の共有例

リリース: 2022-01-17 15:44:33
転載
2538 人が閲覧しました

この記事では、mysql のフィールドのデフォルト値に関して発生する可能性のある関連する問題について説明します。お役に立てば幸いです。

MySQL 8.0 タイムスタンプによって引き起こされる問題の共有例

今日、ビジネスから問題が報告されました。modify_time フィールドを null にすることはできず、ビジネス フィードバック フィールドはデフォルト値に設定されています。特定のビジネス エラー メッセージ

MySQL 8.0 タイムスタンプによって引き起こされる問題の共有例

エラー メッセージから判断すると、modify_time フィールドにデフォルト値が設定されていないか、デフォルト値が正しく設定されていない可能性があります。

次にテーブル構造を確認します:

CREATE TABLE `jj_xxxx` (
....
  `create_time` timestamp NOT NULL DEFAULT '1999-12-31 23:00:00' ,
  `update_user` int DEFAULT NULL,
  `modify_time` timestamp NOT NULL DEFAULT '1999-12-31 23:00:00',
 ....
  PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4893 DEFAULT CHARSET=utf8 COMMENT='xxxxx'
ログイン後にコピー

テーブル構造から判断するとデフォルト値の設定で問題ないようですが、sql_modeパラメータの設定を確認すると問題ないようです見つかりました;

同じことが、ビジネス担当者によって報告されたオンライン テーブルにも当てはまります。はい、オンラインでは正常ですが、このビジネスを他の環境に移行する必要があります。ビジネスからデータベースへの別のセットです。環境;

突然、データベース バージョンの違いを考慮しました。新しい移行環境は MySQL バージョン 8.0 ですが、オンライン環境はバージョン 5.7 です。2 つのバージョンの明示的_defaults_for_timestamp パラメータによって設定されるデフォルト値は次のとおりです。異なる;

理由:

explicit_defaults_for_timestamp システム変数は、タイムスタンプに対する MySQL サーバーの応答を決定します カラム内のデフォルト値と NULL 値の処理が異なります。

この変数は MySQL バージョン 5.6.6 から導入されました。グローバル レベルとセッション レベルに分かれています。動的に更新できます。デフォルト値は OFF です。

8.0 では、デフォルト値が on

explicit_defaults_for_timestamp=OFF に変更されました。つまり、デフォルト タイムスタンプのデフォルト形式; タイムスタンプタイプのデフォルト形式は何ですか?

1. 他のフィールド タイプとは異なり、このフィールドのデフォルトは null ではありません。また、デフォルトの null を設定することはできません。

2. 最初の列のタイムスタンプ フィールド (次の場合)指定は強制されません。デフォルト値または on update 属性が使用される場合、デフォルトで DEFAULT CURRENT_TIMESTAMP および ON UPDATE CURRENT_TIMESTAMP に設定されます。

3. 最初以外の列のタイムスタンプ フィールドについては、デフォルト値の指定が強制されない場合、DEFAULT '0000-00-00 00:00:00'

4この列に null 値を挿入すると、デフォルト値

explicit_defaults_for_timestamp=ON に自動的に変換され、タイムスタンプのデフォルト機能

1 がオフになります。 not null は明示的に指定されていないため、デフォルトは null;

2 です。デフォルト値も CURRENT_TIMESTAMP;

3 ではなく null になります。not null 属性が指定されており、値がinset メソッドでフィールドが指定されていない場合は、strict sql_mode でエラーが報告されます。 Insert '0000-00-00 00:00:00' under non-strict sql_mode;

次のシナリオを慎重に検討する必要があります:

1. タイムスタンプがありません。 null デフォルト CURRENT_TIMESTAMP 、explicit_defaults_for_timestamp が 0 から 1 に変更されると、ビジネスにどのような影響がありますか?

タイムスタンプ フィールドにデフォルト値がある場合、このような変換を行うと、タイムスタンプ フィールド値が null の元の挿入ステートメントが失敗し、ビジネスに影響を及ぼします。

2. 日時の変換タイムスタンプのデフォルト CURRENT_TIMESTAMP にデフォルトの null を設定すると、ビジネスにどのような影響が生じますか?

このようなフィールド変換を行うと、フィールドの元の null 値がすべて CURRENT_TIMESTAMP に変換されます。履歴データが大量にある場合、このような変換はリソースを非常に消費します。同時に、価値観の変化がビジネスに与える影響も考慮する必要があります。

推奨学習:

mysql ビデオ チュートリアル

以上がMySQL 8.0 タイムスタンプによって引き起こされる問題の共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:Mysql技术公众号
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート