私はこれをやろうとしていますが、MySQLでは許可されていないようです。この問題の解決策はありますか、またはINSERTクエリに常に関数を含めることが期待されますか?
CREATE TABLE foo(
created INT NOT NULL DEFAULT UNIX_TIMESTAMP()
)
CURRENT_TIMESTAMPのデフォルトを受け入れるTIMESTAMP型を知っていますが、クライアントはデータベースでエポック時間を使用することを主張しました。
MySQLがTIMESTAMP
データ型を実装する方法は、実際にはエポック時間をデータベースに保存しています。したがって、デフォルトとして_CURRENT_TIMESTAMP
_のTIMESTAMP
列を使用し、intとして表示する場合はUNIX_TIMESTAMP()
を適用できます。
_CREATE TABLE foo(
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
insert into foo values (current_Date()),(now());
select unix_timestamp(created) from foo;
+-------------------------+
| unix_timestamp(created) |
+-------------------------+
| 1300248000 |
| 1300306959 |
+-------------------------+
2 rows in set (0.00 sec)
_
ただし、列のデータ型を本当にINT
にしたい場合は、R。Bemroseの提案を使用して、トリガーで設定できます。
_CREATE TABLE foo(
created INT NULL
);
delimiter $$
create trigger tr_b_ins_foo before insert on foo for each row
begin
if (new.created is null)
then
set new.created = unix_timestamp();
end if;
end $$
delimiter ;
insert into foo values (unix_timestamp(current_Date())), (null);
select created from foo;
+------------+
| created |
+------------+
| 1300248000 |
| 1300306995 |
+------------+
2 rows in set (0.00 sec)
_
ドキュメント から:
1つの例外を除いて、デフォルト値は定数でなければなりません。関数または式にすることはできません。これは、たとえば、日付列のデフォルトをNOW()やCURRENT_DATEなどの関数の値に設定できないことを意味します。例外は、TIMESTAMP列のデフォルトとしてCURRENT_TIMESTAMPを指定できることです。
このためのトリガーを作成できます。
挿入用
CREATE TRIGGER {trigger_name} BEFORE INSERT ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());
CREATE TRIGGER my_trigger_name_1 BEFORE INSERT ON foo FOR EACH ROW SET new.created = UNIX_TIMESTAMP(NOW());
for update
CREATE TRIGGER {trigger_name} BEFORE UPDATE ON {table_name} FOR EACH ROW SET new.{field_name} = UNIX_TIMESTAMP(NOW());
CREATE TRIGGER my_trigger_name_2 BEFORE UPDATE ON foo FOR EACH ROW SET new.created = UNIX_TIMESTAMP(NOW());
注:MYSQL TRIGGERのパフォーマンスについてはわかりません
これらのリンクをご覧ください
まあ、MySQLで直接実行できない場合は、 BEFORE INSERT... FOR EACH ROW
トリガー 。