是否可以在MySQL中创建带有UNIX\u时间戳默认值的列?
我正试图这么做,但似乎MySQL不允许我这么做。是否有此问题的解决方案,或者是否希望我始终在INSERT查询中包含此函数是否可以在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不允许您直接这样做,您可以始终使用一个。从: 除了一个例外,默认值 必须是常数;这不可能是一场战争 函数或表达式。这就是说,, 例如,您不能设
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: