web-dev-qa-db-ja.com

MySQLでUNIX_TIMESTAMPデフォルトを使用して列を作成することは可能ですか?

私はこれをやろうとしていますが、MySQLでは許可されていないようです。この問題の解決策はありますか、またはINSERTクエリに常に関数を含めることが期待されますか?

CREATE TABLE foo(
  created INT NOT NULL DEFAULT UNIX_TIMESTAMP()
)

CURRENT_TIMESTAMPのデフォルトを受け入れるTIMESTAMP型を知っていますが、クライアントはデータベースでエポック時間を使用することを主張しました。

34
Kit Sunde

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)
_
48
Ike Walker

ドキュメント から:

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

19
Joe Stefanelli

このためのトリガーを作成できます。

挿入用

  • クエリ

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のパフォーマンスについてはわかりません

これらのリンクをご覧ください

  1. SQLサーバートリガーの実装の欠点のいくつかを特定する

  2. トリガーの使用

8
Arjun Raj

まあ、MySQLで直接実行できない場合は、 BEFORE INSERT... FOR EACH ROWトリガー

4
Powerlord