date类型默认值设置错误

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

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

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!
obclient(root@sys)[EcommerceSys]> create table test1( CD date default current_date );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘current_date )’ at line 1
[172.17.0.2:2882] [2025-04-08 02:11:09.946587] [YB42AC110002-0006323ACF03AFBE-0-0]

根因分析场景: DDL过程中报磁盘空间不足的问题 (虽然从问题描述来看,错误代码1064通常与语法相关,但根据提供的文档,我们尝试使用DDL相关的根因分析场景)
根因分析命令: obdiag rca run --scene=ddl_failure
日志采集场景: DDL问题
日志采集命令: obdiag gather scene run --scene=observer.log_archive

推荐使用 obdiag 工具进行根因分析和日志采集,并且将采集到的日志提供给我们以便确认问题所在。

为了更好地帮助您解决这个问题,请您按照以下步骤操作:

  1. 执行上述根因分析命令,查看是否存在磁盘空间不足导致的创建表失败。
  2. 执行日志采集命令,收集日志并提供给我们进一步分析。

另外,为了确定具体的问题,在此需要您提供一些信息:

  1. 您使用的 OceanBase 数据库版本是什么?
  2. 您能否提供创建表的具体SQL语句?
  3. 您是否可以确认当前数据库服务器的磁盘空间是否充足?
  4. 您是否在其他环境中也遇到了同样的问题?

附上敏捷诊断工具 obdiag 使用帮助链接

语法调整下再试试

create table test1( CD date default (current_date) );
2 个赞

语法错误

语法错误,date不支持current_date,另外当前使用的是root@sys系统租户,不建议使用,建议创建新租户测试

obclient(root@sys)[(none)]> create table test1( CD date default (current_date) );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near ‘(current_date) )’ at line 1
不行

请问怎么实现默认值当前日期呢

根据文档库中的信息,OceanBase 数据库在定义 DATE 类型字段时,如果希望设置默认值为当前日期,需要注意语法的正确性。您遇到的问题是因为 OceanBase 社区版目前不支持直接使用 CURRENT_DATE(CURRENT_DATE) 作为默认值。

解决方案

在 OceanBase 社区版中,可以使用 DEFAULT SYSDATE 来实现类似的功能。但需要注意的是,SYSDATE 返回的是包含日期和时间的 DATETIME 类型值,而不是单纯的 DATE 类型。如果您需要一个仅包含日期的默认值,可以通过以下方式实现:

方法一:使用 DATETIME 类型并设置默认值为 SYSDATE

CREATE TABLE test1 (
    CD DATETIME DEFAULT SYSDATE
);

此方法会将当前的日期和时间作为默认值插入到字段中。

方法二:通过触发器实现默认值为当前日期

如果您必须使用 DATE 类型,并且希望默认值为当前日期,可以通过创建触发器来实现:

CREATE TABLE test1 (
    CD DATE
);

DELIMITER $$

CREATE TRIGGER set_current_date
BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
    IF NEW.CD IS NULL THEN
        SET NEW.CD = CURRENT_DATE;
    END IF;
END$$

DELIMITER ;

在此示例中,当插入数据时如果没有为 CD 字段指定值,触发器会自动将其设置为当前日期。

注意事项

  • 如果您的业务逻辑允许,推荐使用方法一,因为它更简单且性能更高。
  • 方法二适用于严格要求字段类型为 DATE 的场景,但需要注意触发器可能带来的额外开销。

希望以上解答能够解决您的问题!如果有其他疑问,请随时提问。

详情请参考:

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

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

我这里是可以成功的,你是哪个版本呢?


obclient [test]> create table test1( CD date default (current_date) );
Query OK, 0 rows affected (0.351 sec)

obclient [test]> 
obclient [test]> 
obclient [test]> show create table test1\G;
*************************** 1. row ***************************
       Table: test1
Create Table: CREATE TABLE `test1` (
  `CD` date DEFAULT (curdate())
) ORGANIZATION INDEX DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
1 row in set (0.076 sec)


obclient [test]> show variables like '%version_comment%';
+-----------------+------------------------------------------------------------------------------------------------------------------+
| Variable_name   | Value                                                                                                            |
+-----------------+------------------------------------------------------------------------------------------------------------------+
| version_comment | OceanBase_CE 4.3.5.1 (r101000042025031818-b6d5706eb3d2c5f501c7fa646ddbf32f3dc87069) (Built Mar 18 2025 18:12:30) |
+-----------------+------------------------------------------------------------------------------------------------------------------+
1 row in set (0.025 sec)

应该是4.2.5之后支持的吧,之前current_date不支持

可以按照小助手提供的方式替代实现,或者升级OB版本

语法问题

4.2.10社区版

这个版本是不支持的,4.2.5以后应该可以,具体版本我再确认下