是否可以在MySQL中创建带有UNIX\u时间戳默认值的列?

是否可以在MySQL中创建带有UNIX\u时间戳默认值的列?,mysql,sql,database,database-design,database-schema,Mysql,Sql,Database,Database Design,Database Schema,我正试图这么做,但似乎MySQL不允许我这么做。是否有此问题的解决方案,或者是否希望我始终在INSERT查询中包含此函数 CREATE TABLE foo( created INT NOT NULL DEFAULT UNIX_TIMESTAMP() ) 我知道时间戳类型接受当前的默认时间戳,但我的客户端坚持在数据库中使用纪元时间。好吧,如果MySQL不允许您直接这样做,您可以始终使用一个。从: 除了一个例外,默认值 必须是常数;这不可能是一场战争 函数或表达式。这就是说,, 例如,您不能设

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

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

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

好吧,如果MySQL不允许您直接这样做,您可以始终使用一个。

从:

除了一个例外,默认值 必须是常数;这不可能是一场战争 函数或表达式。这就是说,, 例如,您不能设置 日期列的默认值为 函数的值,如NOW()或 当前日期。例外情况是 您可以将当前_时间戳指定为 时间戳列的默认值


MySQL实现
时间戳
数据类型的方式实际上是将历元时间存储在数据库中。因此,您可以使用默认值为
CURRENT\u TIMESTAMP
TIMESTAMP
列,并将
UNIX\u 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)

您可以为此创建触发器

用于插入

  • 质疑
为每一个新设置的行在{table_name}上插入之前创建触发器{TRIGGER_name}。{field_name}=UNIX_TIMESTAMP(NOW())

  • 在这种情况下
CREATE TRIGGER my_TRIGGER_name_1,然后在foo上为每一行设置新的INSERT.created=UNIX_TIMESTAMP(NOW())

用于更新

  • 质疑
在更新{table_name}之前为每一个新设置的行创建触发器{TRIGGER_name}。{field_name}=UNIX_TIMESTAMP(NOW())

  • 在这种情况下
CREATE TRIGGER my_TRIGGER_name_2,然后在foo上为每一行设置新的。created=UNIX_TIMESTAMP(NOW())

注意:我不知道MYSQL触发器的性能

请浏览这些链接


  • 现在,使用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())
    );
    

    请参见

    老虎?-它们被驯服了,我希望:-)查询TIMESTAMP和BIGINT在性能上有区别吗?它实际上是以字符串的形式存储的,还是高效存储的?任何选择数据类型的人都应该记住,时间戳与INT面临相同的2038,但与INT相同。考虑将UNIX_时间戳(Epoch)存储在UNSIGNED INT(11)中的一个原因是将溢出错误推到下一个世纪(BIGINT甚至更远)。随着新技术的出现,您的代码很可能需要在那时重新编写。然而,2038年将发生在我们的一生中。我们今天构建的数据库在那时仍然可以作为遗留系统存在@JRun-我希望MySQL中的时间戳在后端被视为INT,因为它具有相同的数值限制。我应该澄清-我上面的评论是相对于MySQL 5.5的。谁知道未来的版本会做什么。根据开发人员文档:这里是对我的观点的参考。注:根据开发人员文档,范围在数学上与“签名”INT相同。时间戳数据类型用于包含日期和时间部分的值。时间戳的范围为“1970-01-01 00:00:01”UTC到“2038-01-19 03:14:07”UTC。URL: