How to assign a default value to a date type field in MySQL

很多时候,由于业务需要,我们期望在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_DATECURDATE()是同义词,所以两者的效果是相同的,不过数据库最终显示为我们为数据库表Date类型字段赋值为(CURDATE())

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qwfys200

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值