网站Logo 时光杂货铺

疑难杂症

admin
8
2026-01-02

数据库字段默认值插入,服务器时序一致性问题

新建一张表

CREATE TABLE wm_user (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    username VARCHAR(90) NOT NULL COMMENT '用户名',
    salt CHAR(8) NOT NULL COMMENT '密码盐值',
    password VARCHAR(90) NOT NULL COMMENT '密码(加盐加密后存储)',
    avatar VARCHAR(255) DEFAULT NULL COMMENT '用户头像地址',
    phone VARCHAR(11) NOT NULL COMMENT '手机号',
    email VARCHAR(90) DEFAULT NULL COMMENT '用户邮箱',
    nickname VARCHAR(90) DEFAULT NULL COMMENT '用户昵称',
    location VARCHAR(255) DEFAULT NULL COMMENT '用户所在地',
    status TINYINT(1) NOT NULL DEFAULT 0 COMMENT '账号状态;0:未启用,1:启用',
    type TINYINT NOT NULL DEFAULT 1 COMMENT '账号类型;1:普通账号,2:大V账号',
    created_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    updated_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    is_deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否逻辑删除;0:未删除,1:已删除',
    PRIMARY KEY (id),
    UNIQUE INDEX uk_wm_user_username (username),
    UNIQUE INDEX uk_wm_user_phone (phone),
    INDEX idx_wm_user_status (status),
    INDEX idx_wm_user_is_deleted (is_deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT = '自媒体用户表';

其中,NOT NULL的字段自动插入数据会填充默认值,这样可以不在代码里手动New Data或者SQL 填充now().

但这又引入了一个新的问题, 如 数据库实例部署在多台服务器上,不同的服务器时间不一致。

方案一:强制时间同步 给你的所有数据库服务器,都配置一个 「统一的时间源」,让所有服务器的系统时间,强制保持毫秒级的完全一致,误差≤1ms。

实现方式:开启【NTP 时间同步服务】

NTP(Network Time Protocol):网络时间协议,是专门用来做「多服务器时间同步」的标准服务,所有 Linux/Windows 服务器都原生支持,零成本、零开发、零侵入

✔️ 操作方式

生产数据库服务器,大概率是 Linux(CentOS/Ubuntu),运维执行 2 条命令即可,永久生效:

# 1. 安装NTP服务(大部分服务器预装了)
yum install ntp -y
# 2. 启动并开机自启NTP,自动同步阿里云/国家授时中心的标准时间
systemctl start ntpd && systemctl enable ntpd
✅ 同步效果

配置完成后,你的所有数据库服务器,系统时间会和「国家标准时间」完全一致,误差只有零点几毫秒,对于业务来说,就是「绝对的同一时间」。

✅ 为什么这是最优解?

  1. 根治问题:时间源统一了,CURRENT_TIMESTAMP 获取的时间就绝对一致,时间字段的自动赋值再也不会错乱;

  2. 零成本:不用改一行代码、不用改一句 SQL、不用改建表语句,你的所有自动赋值优化全部保留;

  3. 全局生效:不仅解决了 MySQL 的时间问题,你的应用服务器、缓存服务器、消息队列等所有服务器的时间都同步了,解决了所有系统的时间一致性问题

  4. 大厂标配:阿里 / 腾讯 / 字节等所有大厂,所有服务器都强制开启 NTP 同步,这是运维的基础规范。

✔️ 一句话:只要做了 NTP 时间同步,你这个问题就彻底解决了,再也不用操心!

方案二:MySQL 主从架构的「天然特性」(如果生产服务器是这种架构)

出现这种数据库多实例情况,大概率是 主从架构 。这个架构下,还有一个 「天然的时间一致性保障」,即使 NTP 同步有微小误差,也能保证你的业务数据时间绝对一致!

✅ 主从架构的核心执行逻辑

MySQL 主从架构的标准用法是:

所有的 插入 / 更新 / 删除 操作,都只在【主库】执行;从库只负责查询,不执行写入操作

✅ 时间一致性的保障点

你的 wm_user 表的所有 INSERT/UPDATE 操作,全部走主库,那么:

  • 所有的 created_time/updated_time 的自动赋值,都是调用主库的 CURRENT_TIMESTAMP,获取的是主库的系统时间

  • 从库只是把主库的数据同步过去,时间字段的值是「主库生成好的」,不会在从库重新生成