当前位置:首页 > 技术分析 > 正文内容

如何为MySQL的Datetime列设置默认值

技术背景

在数据库设计中,经常需要为日期和时间列设置默认值。在SQL Server中,可以使用getdate()函数来为日期时间列设置当前时间作为默认值。而在MySQL里,不同版本对Datetime列设置默认值的支持有所不同。了解如何为MySQL的Datetime列设置默认值,对于数据库的设计和开发至关重要。

实现步骤

1. MySQL 5.6.5之前的版本

在MySQL 5.6.5之前,不能直接为Datetime列使用函数设置默认值,但可以使用TIMESTAMP类型来实现类似功能:

-- 创建表,包含一个TIMESTAMP列并设置默认值为当前时间
CREATE TABLE test (
    str varchar(32), 
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

或者使用触发器来为Datetime列设置默认值:

-- 创建表
CREATE TABLE mytable (
    id INT AUTO_INCREMENT PRIMARY KEY,
    date_created DATETIME
);

-- 创建触发器,在插入记录时设置date_created为当前时间
DELIMITER //
CREATE TRIGGER set_date_created BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
    SET NEW.date_created = NOW();
END //
DELIMITER ;

2. MySQL 5.6.5及之后的版本

从MySQL 5.6.5开始,可以直接为Datetime列设置默认值,甚至可以设置列在记录更新时自动更新:

-- 创建表,设置creation_time列的默认值为当前时间,modification_time列在记录更新时自动更新
CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
);

3. 修改已存在表的列默认值

如果表已经创建,可以使用ALTER TABLE语句来修改列的默认值:

-- 将created_dt列的默认值设置为当前时间
ALTER TABLE `test_table`
CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

-- 将date_column列的默认值设置为指定时间
ALTER TABLE table_name
CHANGE COLUMN date_column date_column DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';

核心代码

使用TIMESTAMP类型设置默认值

CREATE TABLE test (
    str varchar(32), 
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

使用触发器为Datetime列设置默认值

DELIMITER //
CREATE TRIGGER set_date_created BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
    SET NEW.date_created = NOW();
END //
DELIMITER ;

MySQL 5.6.5及之后版本直接为Datetime列设置默认值

CREATE TABLE foo (
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
);

最佳实践

  • 选择合适的方法:如果使用的是MySQL 5.6.5及之后的版本,推荐直接为Datetime列设置默认值,这样代码更简洁。如果是旧版本,可以考虑使用TIMESTAMP类型或触发器。
  • 考虑范围限制TIMESTAMP类型的范围是'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC,如果需要处理超出这个范围的日期,应使用Datetime类型。
  • 触发器的优化:使用触发器时,要注意避免在插入记录时覆盖用户手动设置的值,可以使用IFNULL函数来实现:
DELIMITER //
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW
BEGIN
    SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());
END //
DELIMITER ;

常见问题

1. 提示“Invalid default value”错误

这通常是因为使用的MySQL版本不支持为Datetime列设置函数作为默认值。请检查MySQL版本,如果是5.6.5之前的版本,需要使用TIMESTAMP类型或触发器。

2. TIMESTAMP列自动更新问题

如果定义了TIMESTAMP列的默认值为CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,在更新记录时,该列会自动更新为当前时间。如果不希望该列更新,需要在UPDATE语句中明确指定该列的值。

3. 触发器覆盖手动设置的值

使用触发器为Datetime列设置默认值时,如果用户手动设置了该列的值,触发器可能会覆盖这个值。可以使用IFNULL函数来避免这个问题。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3935.html

分享给朋友:

“如何为MySQL的Datetime列设置默认值” 的相关文章

Linux世界的多样性:yum和apt的对比,让你感受不同发行版的特色

yum和apt是两种常用的Linux软件包管理器,它们都可以用来安装、更新和删除软件包。但是,它们之间也有一些重要的区别,本文将对它们进行分析对比。yum是Yellowdog Updater Modified的缩写,它是基于RPM(Red Hat Package Manager)的软件包管理器,主要...

gitlab常用命令大全

GitLab常用命令大全GitLab是一个基于Git的Web平台,它不仅提供代码托管,还集成了持续集成/持续交付(CI/CD)、代码审查、问题追踪等功能。在日常使用GitLab的过程中,我们常常需要使用一系列命令来管理代码仓库、处理分支和标签等。以下是GitLab常用的Git命令大全,并附上详细解释...

如何在GitLab上回退指定版本的代码?GitLab回退指定版本问题分析

在Git中,回退到指定版本并不是删除或撤销之前的提交,而是创建一个新的提交,该提交包含指定版本的内容。这意味着您需要将当前代码更改与指定版本之间的差异进行比较,并将其合并到一个新的提交中。如果您没有更新本地代码,并且您希望将 GitLab 仓库回退到指定版本,您可以使用以下命令:git fetchg...

你感动了吗?佳能超规格镜头 RF 24-105mm F2.8深度测评

如果要你选一支用作多题材创作的挂机镜头,那我相信很多人会选择24-105mm这个焦段的镜头。作为一支可以实现从广角到长焦的变焦镜头,24-105mm有着丰富的焦段选择。只是基于镜头体积以及光学结构上的限制,此前的24-105mm镜头只能恒定在F4的光圈。而佳能打破了这一限制,将实用焦段和恒定光圈完美...

Vue进阶(幺叁捌):vue路由传参的几种基本方式

1、动态路由(页面刷新数据不丢失)methods:{ insurance(id) { //直接调用$router.push 实现携带参数的跳转 this.$router.push({ path: `/particulars/${id}`,...

一套代码,多端运行——使用Vue3开发兼容多平台的小程序

介绍Vue3发布已经有一段时间了,从目前来看,其生态还算可以,也已经有了各种组件库给予了支持,但是不管是Vue3还是Vue2都无法直接用来开发小程序,因此国内一些技术团队针对Vue开发了一些多端兼容运行的开发框架,今天来体验一下使用Taro来体验一下使用Vue3开发多平台运行的小程序,以便于兼容各大...