很多时候,由于业务需要,我们期望在mysql 数据库中存储一个日期类型的数据,在创建表的时候,如果期望字段不为空,并给该字段取一个默认值。
mysql 5.7
这是一个看起来很常见的业务诉求,但是mysql数据库在日期类型DATE
支持上却差强人意,具体来说,对于mysql 5.7我们不能直接将字符串常量CURRENT_DATE
设置为其默认值,而应该将一个具体的日期值,比如说1970-01-01
,用单引号引起来,做为默认值。
-- tb_organization: table
DROP TABLE IF EXISTS `tb_organization`;
CREATE TABLE `tb_organization` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`org_code` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '机构编码',
`parent_code` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '上级机构编码',
`org_name` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '机构名称',
`full_name` VARCHAR(512) NOT NULL DEFAULT '' COMMENT '全称',
`establish_date` DATE NOT NULL DEFAULT '1970-01-01' COMMENT '成立日期',
`deleted` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '删除标记,0:未删除1:已删除',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录创建时间',
`created_by` BIGINT(20) NOT NULL DEFAULT '0' COMMENT '记录创建者',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',
`updated_by` INT(11) NOT NULL DEFAULT '0' COMMENT '记录更新者',
`version` INT(11) NOT NULL DEFAULT '0' COMMENT '版本号',
`remark` VARCHAR(256) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = `utf8mb4` COMMENT ='组织机构';
mysql 8.0
对于mysql 8.0.13以后的版本来说,我们可以将CURDATE()
用半角圆括号括起来做为Date
类型字段的默认值。
CREATE TABLE `tb_organization` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`org_code` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '机构编码',
`parent_code` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '上级机构编码',
`org_name` VARCHAR(256) NOT NULL DEFAULT '' COMMENT '机构名称',
`full_name` VARCHAR(512) NOT NULL DEFAULT '' COMMENT '全称',
`establish_date` DATE NOT NULL DEFAULT (CURDATE()) COMMENT '成立日期',
`deleted` TINYINT NOT NULL DEFAULT '0' COMMENT '删除标记,0:未删除1:已删除',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录创建时间',
`created_by` BIGINT NOT NULL DEFAULT '0' COMMENT '记录创建者',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',
`updated_by` INT NOT NULL DEFAULT '0' COMMENT '记录更新者',
`version` INT NOT NULL DEFAULT '0' COMMENT '版本号',
`remark` VARCHAR(256) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = `utf8mb4`
COLLATE = `utf8mb4_0900_ai_ci` COMMENT ='组织机构';
由于
CURRENT_DATE
与CURDATE()
是同义词,所以两者的效果是相同的,不过数据库最终显示为我们为数据库表Date
类型字段赋值为(CURDATE())
参考文献