I'm trying to do this, but it seems like MySQL isn't allowing me. Is there a solution to this issue or am I expected to always include the function in my INSERT queries?
CREATE TABLE foo( created INT NOT NULL DEFAULT UNIX_TIMESTAMP() )
I'm aware of the TIMESTAMP type that accepts a CURRENT_TIMESTAMP default, but my client insisted on using epoch time in the database.
Use of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP is specific to TIMESTAMP. The DEFAULT clause also can be used to specify a constant (nonautomatic) default value; for example, DEFAULT 0 or DEFAULT '2000-01-01 00:00:00'.
Explicit Default Handling Prior to MySQL 8.0. This means, for example, that you cannot set the default for a date column to be the value of a function such as NOW() or CURRENT_DATE . The exception is that, for TIMESTAMP and DATETIME columns, you can specify CURRENT_TIMESTAMP as the default.
TIMESTAMP has a default of 0 unless defined with the NULL attribute, in which case the default is NULL .
The way MySQL implements the TIMESTAMP
data type, it is actually storing the epoch time in the database. So you could just use a TIMESTAMP
column with a default of CURRENT_TIMESTAMP
and apply the UNIX_TIMESTAMP()
to it if you want to display it as an int:
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)
However, if you really want the datatype of the column to be INT
, you can use R. Bemrose's suggestion and set it via trigger:
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)
From the documentation:
With one exception, the default value must be a constant; it cannot be a function or an expression. This means, for example, that you cannot set the default for a date column to be the value of a function such as NOW() or CURRENT_DATE. The exception is that you can specify CURRENT_TIMESTAMP as the default for a TIMESTAMP column.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With