10

MySQL (バージョン 5) に次のテーブルがあります。

id     int(10)       UNSIGNED             No    auto_increment              
year   varchar(4)    latin1_swedish_ci    No             
title  varchar(250)  latin1_swedish_ci    Yes   NULL         
body   text          latin1_swedish_ci    Yes   NULL

そして、データベースが挿入時に現在の年を自動追加するようにしたいので、次のSQLステートメントを試しました:

ALTER TABLE `tips` CHANGE `year` `year` VARCHAR(4) NOT NULL DEFAULT year(now())

しかし、次のエラーが発生します。

1067 - Invalid default value for 'year'

この機能を取得するにはどうすればよいですか? 前もって感謝します!

4

3 に答える 3

19

データ型指定の DEFAULT 値句は、列のデフォルト値を示します。1 つの例外を除いて、デフォルト値は定数でなければなりません。関数または式にすることはできません。これは、たとえば、日付列のデフォルトを NOW() や CURRENT_DATE などの関数の値に設定できないことを意味します。例外は、CURRENT_TIMESTAMP を TIMESTAMP 列のデフォルトとして指定できることです。

-- MySQL マニュアル

ただし、値を設定するトリガーを作成することはできます。お役に立てれば幸いですが、MySQL でストアド プロシージャを作成することにあまり慣れていません。

私はこれがうまくいくと思います:

CREATE TRIGGER ins_year
BEFORE INSERT ON tips
    FOR EACH ROW SET NEW.year = YEAR(NOW());
于 2008-11-19T14:01:47.453 に答える
8

以下が機能するはずです。

ALTER TABLE tips MODIFY COLUMN year YEAR(4) NOT NULL DEFAULT CURRENT_TIMESTAMP

詳細については、年のデータ型を参照してください。

そのため、アクセスしてからこれをテストしましたが、機能しません。別の投稿者が指摘したように、CURRENT_TIMESTAMP はTIMESTAMPデータ型でのみ機能します。

完全なタイムスタンプを保存し、コードで年のみを使用することに特定の問題はありますか? そうでない場合は、この値をタイムスタンプとして保存することをお勧めします。

あなたの他のオプションは、トリガーを作成することです:

CREATE TRIGGER example_trigger AFTER INSERT ON tips
FOR EACH ROW BEGIN
UPDATE tips SET year = YEAR(NOW()) WHERE tip_id = NEW.tip_id
END;

それ以外の場合は、この値をコード内から INSERT ステートメントに割り当てます。

あなたの場合の最善の解決策は、特定のアプリケーションを取り巻く状況に完全に依存します。

于 2008-11-19T13:55:16.420 に答える