我正在尝试这样做,但似乎MySQL不允许我这样做。是否有解决此问题的方法,或者我希望在我的INSERT查询中始终包含该函数?
CREATE TABLE foo(
created INT NOT NULL DEFAULT UNIX_TIMESTAMP()
)
我知道TIMESTAMP类型接受CURRENT_TIMESTAMP默认值,但我的客户端坚持在数据库中使用纪元时间。
答案 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)
有一个例外,默认值 必须是一个常数;它不可能是一个 功能或表达。这意味着, 例如,你不能设置 日期列的默认值为 一个函数的值,如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的表现
请浏览这些链接
答案 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())
);