datetime毫秒 - mysql datetime自动更新




你如何设置MySQL日期时间列的默认值? (16)

你如何设置MySQL日期时间列的默认值?

在SQL Server中它是getdate() 。 什么是MySQL的等价物? 如果这是一个因素,我使用MySQL 5.x。


MySQL( 版本5.6.5之前 )不允许将函数用于默认的DateTime值。 由于其奇怪的行为,TIMESTAMP不适用,不建议用作输入数据。 (请参阅MySQL数据类型默认值 。)

也就是说,你可以通过创建一个触发器来实现这一点。

我有一个类型为DateTime的DateCreated字段的表。 我在该表上创建了一个触发器“Before Insert”和“ SET NEW.DateCreated=NOW() ”,它的工作效果很好。

我希望这有助于某人。



举例来说,如果我有一个名为'site'的表,其created_at和update_at列都是DATETIME并且需要现在的缺省值,那么我可以执行以下sql来实现此目的。

ALTER TABLE `site` CHANGE `created_at` `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `created_at` `created_at` DATETIME  NULL DEFAULT NULL;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

ALTER TABLE `site` CHANGE `updated_at` `updated_at` DATETIME NULL DEFAULT  NULL;

语句的顺序很重要,因为表不能有两列TIMESTAMP类型的列,其默认值为CUREENT TIMESTAMP


你可以使用触发器来做这种类型的东西。

CREATE TABLE `MyTable` (
`MyTable_ID`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
`MyData`  varchar(10) NOT NULL ,
`CreationDate`  datetime NULL ,
`UpdateDate`  datetime NULL ,
PRIMARY KEY (`MyTable_ID`)
)
;

CREATE TRIGGER `MyTable_INSERT` BEFORE INSERT ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the creation date
    SET new.CreationDate = now();

        -- Set the udpate date
    Set new.UpdateDate = now();
END;

CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END;

在定义多行触发器时,必须更改分隔符,因为MySQL编译器会将分号用作触发器的结尾并生成错误。 例如

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;


如果您试图将默认值设置为NOW(),则MySQL支持您必须更改该列的类型TIMESTAMP而不是DATETIME。 TIMESTAMP的当前日期和时间默认为..我认为它会解决您的问题..


如果您试图将默认值设置为NOW(),我不认为MySQL支持该值。 在MySQL中,除了TIMESTAMP数据类型列之外,您不能使用函数或表达式作为任何类型列的默认值,您可以将CURRENT_TIMESTAMP指定为默认值。


对于所有那些试图在MySQL中设置默认DATETIME值的人来说,我完全知道你的感受/感受。 所以这里是:

ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

仔细观察我没有0周围添加单引号/双引号

在解决这个问题之后,我毫不夸张地说:D


对我来说,触发器方法运行得最好,但是我发现了这种方法的障碍。 考虑插入时将日期字段设置为当前时间的基本触发器:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

这通常很棒,但是你可以说你想通过INSERT语句手动设置这个域,如下所示:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

会发生什么是触发器会立即覆盖您为该字段提供的值,因此设置非当前时间的唯一方法是跟进UPDATE语句 - yuck! 要在提供值时覆盖此行为,请尝试使用IFNULL运算符稍微修改此触发器:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

这给了两全其美:您可以为您的日期列提供一个值,然后它将采用,否则它将默认为当前时间。 它仍然是贫民区,相对于表格定义中的DEFAULT GETDATE()干净,但我们正在接近!


您可以解析默认时间戳。 首先考虑你正在使用哪个字符集,例如如果你使用utf8这个字符集支持所有语言,如果你使用laten1这个字符集只支持英文。 如果您正在任何项目下工作,您应该了解客户端时区,并选择您是客户端区域,请进行下一步设置。 这一步是强制性的。


我正在运行MySql Server 5.7.11和这句话:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

工作。 但以下几点:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

只是工作

作为旁注 ,它在mysql文档中提到:

DATE类型用于包含日期部分但不包含时间部分的值。 MySQL以'YYYY-MM-DD'格式检索并显示DATE值。 支持的范围是'1000-01-01'到'9999-12-31'。

即使他们也说:

无效的DATE,DATETIME或TIMESTAMP值将转换为相应类型('0000-00-00'或'0000-00-00 00:00:00')的“零”值。


虽然您无法在默认定义中使用DATETIME执行此操作,但您可以简单地在您的insert语句中包含select语句,如下所示:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

请注意桌子周围缺乏引号。

对于MySQL 5.5


这是我的触发器例子:

/************ ROLE ************/
drop table if exists `role`;
create table `role` (
    `id_role` bigint(20) unsigned not null auto_increment,
    `date_created` datetime,
    `date_deleted` datetime,
    `name` varchar(35) not null,
    `description` text,
    primary key (`id_role`)
) comment='';

drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
    on `role`
    for each row 
    set new.`date_created` = now();


这里是如何在MySQL 5.1上完成的:

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

我不知道为什么你必须输入两次列名。


CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

在上面的查询中创建'testtable',我使用'1999-12-12 12:12:12'作为DATETIME列colname默认值





datetime