数据库默认字段新增修改时候无效

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】为什么create time db timestamp NULL DEFAULT CURRENT TIMESTAMP.这样子,新增时候还是null?
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

根据文档库中的信息,当您在创建表时为时间列设置了 NULL DEFAULT CURRENT_TIMESTAMP,这表示该列允许为空,并且如果没有显式提供值,则默认使用当前时间戳。但是,如果在插入数据时显式地将该列设置为 NULL,那么即使设置了默认值,该列仍然会被设置为 NULL

为了确保在插入数据时,如果没有显式提供值,该列能够自动使用当前时间戳,您可以考虑以下两种方案:

  1. 将列设置为 NOT NULL 并设置默认值
    这样可以确保在插入数据时,如果没有显式提供值,该列会自动使用当前时间戳。

    CREATE TABLE your_table (
        id BIGINT NOT NULL PRIMARY KEY,
        create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    );
    
  2. 使用触发器
    如果您希望在某些情况下允许该列为 NULL,但又希望在没有显式提供值时自动使用当前时间戳,可以使用触发器来实现。

    CREATE TABLE your_table (
        id BIGINT NOT NULL PRIMARY KEY,
        create_time DATETIME NULL DEFAULT NULL
    );
    
    DELIMITER //
    CREATE TRIGGER before_insert_your_table
    BEFORE INSERT ON your_table
    FOR EACH ROW
    BEGIN
        IF NEW.create_time IS NULL THEN
            SET NEW.create_time = CURRENT_TIMESTAMP;
        END IF;
    END //
    DELIMITER ;
    

以上两种方案都可以确保在插入数据时,如果没有显式提供值,create_time 列会自动使用当前时间戳。请根据您的实际需求选择合适的方案。

具体信息可参考以下文档:

  1. 定义列的约束类型
  2. 创建表组
  3. 0001 ~ 3999
  4. 定义自增列
  5. 5000 ~ 5999
  6. 查询中使用时间函数
  7. log_restore_concurrency
  8. 日期时间类型概述

小助手已经给你解答这个问题

我的dll已经用第一种方式了,还是报错

用的ob是哪个版本 observer.log日志发一下 也可以按照小助手的提示 排查

如果您已经按照第一种方式设置了 NOT NULL 并且设置了默认值,但仍然遇到问题,可能是由于其他原因导致的。我们可以进一步排查以下几个方面:

  1. 检查表结构
    确认表结构是否正确设置。您可以使用 DESCRIBESHOW CREATE TABLE 命令来查看表结构。

    DESCRIBE your_table;
    -- 或者
    SHOW CREATE TABLE your_table;
    
  2. 检查插入语句
    确认插入语句是否显式地将 create_time 设置为 NULL。如果是这种情况,即使设置了默认值,也会被覆盖。

    INSERT INTO your_table (id, create_time) VALUES (1, NULL);
    
  3. 检查会话变量
    确认会话变量是否影响了默认值的设置。例如,某些会话变量可能会导致默认值不生效。

    SHOW VARIABLES LIKE 'sql_mode';
    
  4. 检查错误日志
    查看数据库的错误日志,了解是否有其他错误信息可以帮助定位问题。

    obdiag collect log
    
  5. 示例验证
    创建一个简单的示例表并插入数据,验证默认值是否生效。

    CREATE TABLE test_table (
        id BIGINT NOT NULL PRIMARY KEY,
        create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
    );
    
    INSERT INTO test_table (id) VALUES (1);
    SELECT * FROM test_table;
    

如果以上步骤都没有发现问题,建议您提供更多的上下文信息,例如完整的表结构和插入语句,以便更准确地定位问题。

如果您仍然无法解决问题,建议联系 OceanBase 的技术支持人员获取进一步的帮助。

详情请参考:

  1. 6000 ~ 6999
  2. 5000 ~ 5999
  3. 4000 ~ 4499
  4. 0001 ~ 3999

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)