是否可以在MySQL中创建一个UNIX_TIMESTAMP默认列?

时间:2011-03-16 19:56:46

标签: mysql sql database database-design database-schema

我正在尝试这样做,但似乎MySQL不允许我这样做。是否有解决此问题的方法,或者我希望在我的INSERT查询中始终包含该函数?

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

我知道TIMESTAMP类型接受CURRENT_TIMESTAMP默认值,但我的客户端坚持在数据库中使用纪元时间。

5 个答案:

答案 0 :(得分:44)

MySQL实现TIMESTAMP数据类型的方式实际上是将纪元时间存储在数据库中。因此,您可以使用默认值为TIMESTAMP的{​​{1}}列,如果要将其显示为int,则应用CURRENT_TIMESTAMP

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) ,则可以使用R. Bemrose的建议并通过触发器设置它:

INT

答案 1 :(得分:19)

来自the documentation

  

有一个例外,默认值   必须是一个常数;它不可能是一个   功能或表达。这意味着,   例如,你不能设置   日期列的默认值为   一个函数的值,如NOW()或   当前的日期。唯一的例外是   您可以将CURRENT_TIMESTAMP指定为   TIMESTAMP列的默认值。

答案 2 :(得分:7)

您可以为此创建触发器。

  

用于插入

  • 查询

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());

  

更新

  • 查询

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. Identify some of the drawback of implementing sql server triggers

  2.   
  3. Using Triggers

  4.   

答案 3 :(得分:4)

好吧,如果MySQL不允许你直接这样做,你可以随时使用BEFORE INSERT... FOR EACH ROW trigger

答案 4 :(得分:0)

现在,对于MySQL v8 +,您可以仅在括号中执行此操作:

CREATE TABLE t1 (
  -- literal defaults
  i INT         DEFAULT 0,
  c VARCHAR(10) DEFAULT '',
  -- expression defaults
  f FLOAT       DEFAULT (RAND() * RAND()),
  b BINARY(16)  DEFAULT (UUID_TO_BIN(UUID())),
  d DATE        DEFAULT (CURRENT_DATE + INTERVAL 1 YEAR),
  p POINT       DEFAULT (Point(0,0)),
  j JSON        DEFAULT (JSON_ARRAY())
);

请参见enter image description here