12

古いコードが実際の日付の代わりに Date および DateTime 列に '0000-00-00' を挿入するのが好きなデータベースがあります。そこで、次の 2 つの質問があります。

  1. これをブロックするためにデータベースレベルでできることはありますか? 列を非 null に設定できることはわかっていますが、それがこれらのゼロ値をブロックしているようには見えません。
  2. 日付フィールドの既存のゼロ値を検出する最良の方法は何ですか? それぞれ 2 ~ 3 の日付列を持つ約 100 のテーブルがあり、それらを個別にクエリしたくありません。

ファローアップ:

デフォルトはすでに null に設定されています。昔は、デフォルトは「0000-00-00」でした。'0000-00-00' を明示的に配置するコードもあります。そのコードを強制的にエラーをスローさせて、それを分離して削除できるようにしたいと思います。

4

7 に答える 7

15

これをブロックするためにデータベースレベルでできることはありますか?

はい、NO_ZERO_DATE モードを有効にします。

SET sql_mode = 'NO_ZERO_DATE';

この動作は文書化されています。さらに、NO_ZERO_IN_DATE を含むようにモードを設定することもできます...

また、sql_mode に STRICT_ALL_TABLES または STRICT_TRANS_TABLES が含まれていることを確認してください。これらの NO_ZERO_IN_DATE がないと、警告が表示されるだけですが、挿入は引き続き成功します。

日付フィールドの既存のゼロ値を検出する最良の方法は何ですか? それぞれ 2 ~ 3 の日付列を持つ約 100 のテーブルがあり、それらを個別にクエリしたくありません。

個別の列は、個別にチェックする必要があることを意味します。それについては何もできません。

于 2010-10-08T15:19:02.897 に答える
1

データと「SET sql_mode = 'NO_ZERO_DATE';」を簡単に修正できないと仮定すると、テーブルにビューを作成できます...

CREATE VIEW filter AS
SELECT other_column, 
CASE 
  WHEN realtable.dodgy_date = 0 THEN NULL 
  ELSE realtable.dodgy_date
END AS dodgy_date
FROM realtable;
于 2010-10-08T15:29:55.713 に答える
0

トリガーを使用して、列の値を適用できます。

于 2010-10-08T15:45:46.373 に答える
0

そこにどの日付が入るかが重要でない場合 (つまり、ゼロでない限り)、列定義を変更して NOW() をデフォルトとして使用できます。おそらく理想的な解決策ではありませんが、次の基準を満たしています: 1) 非 null 2) ゼロ以外

于 2010-10-08T15:16:20.117 に答える
0

列をnull可能にNULLしてデフォルト値にすることもできますが、すでにそれを持っているようで、機能していません。ところで...データを表示するために使用しているツールが日付の表示を好まない可能性がありますNULL...どのツールを使用していますか? それとも、コードによって取得されたデータに「0000-00-00」が表示されていますか?

null 以外のデフォルト値を設定し、次のようなデフォルトとして簡単に認識できるようにすることもできます1900-01-01(通常、この日付に近い日付を処理しないと仮定します)。

于 2010-10-08T15:17:19.197 に答える
0

デフォルトでタイムスタンプを設定することはおそらくオプションです。そのためにはテーブル変更ステートメントを使用します。

ALTER TABLE mytable CHANGE date_update timestamp NOT NULL DEFAULT CURRENT_DATE()

w3c リソースの MySQL CURRENT_DATE() ドキュメント

ゼロ日付を削除して現在の日付などに置き換えるには、次のようにします。

UPDATE mytable SET date_update = CURRENT_DATE() where date_update = "0000-00-00"
于 2014-05-20T09:17:46.330 に答える