次のような列を持つテーブルを作成しようとしています
model_year smallint(4) not null default YEAR(CURRENT_DATE)
しかし、エラーがあります (無効なデフォルト値)。現在の年の model_year のデフォルト値を設定するにはどうすればよいですか?
次のような列を持つテーブルを作成しようとしています
model_year smallint(4) not null default YEAR(CURRENT_DATE)
しかし、エラーがあります (無効なデフォルト値)。現在の年の model_year のデフォルト値を設定するにはどうすればよいですか?
MySQL doc ページから(私の太字):
データ型仕様の
DEFAULT
値句は、列のデフォルト値を示します。1 つの例外を除いて、デフォルト値は定数でなければなりません。関数または式にすることはできません。これは、たとえば、日付列のデフォルトをNOW()
やなどの関数の値に設定できないことを意味しますCURRENT_DATE
。例外は、列CURRENT_TIMESTAMP
のデフォルトとして指定できることです。TIMESTAMP
行を挿入するときに実際の値を指定する必要があると思います。
それをしたくない場合は、NULL を許可し、別のプロセスを実行してデータベースを定期的にスイープすることができます。
update table mytable set model_year = year(current_date) where model_year is null
しかし、これは面倒であり、列に NULL が存在する期間があるため、起動するのはかなり危険です。
これは、すべてのクエリで考慮に入れる必要があるものであり、次のような醜さにつながります。
select a, b, model_year from mytable where model_year is not null
union all
select a, b, year(current_date) from mytable where model_year is null
私は自分でデフォルト以外のルートに行きます。
ストアドプロシージャが必要になります(申し訳ありませんが、MySQLの構文はわかりません)。モデル年列でNULLを検索し、モデル年を設定する同一のINSERTまたはUPDATEで置き換えるINSERTまたはUPDATEでトリガーするストアドプロシージャを設定できます。