违反 Oracle 生日列正则表达式约束
Oracle birthday column regex constrain violated
我希望数据库中的所有日期都采用以下 yyyy-mm-dd 日期格式。例如,“2020-05-28”。但这似乎并没有像我想的那样工作,当我在我的用户 table 中插入一个包含生日列的日期时。
这是我的生日列约束:
birthday DATE NOT NULL CHECK (REGEXP_LIKE(birthday , '\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])*')),
我在尝试插入时收到以下错误:“2020-05-28”或与此相关的任何其他日期:
02290. 00000 - "check constraint (%s.%s) violated"
*Cause: The values being inserted do not satisfy the named check
*Action: do not insert values that violate the constraint.
您错误地解释了 DATE
数据类型的概念。可能,您混合了日期的 显示格式 (当您显示 date
值时看到的值),以及它们的 内部表示 .
A date
就是:约会。它以某种数据库特定格式在内部存储,您无需担心。所以不需要检查约束来控制格式。
每当你需要显示日期时,你可以使用函数to_char()
将其格式化为字符串,如:
to_char(birthday, 'yyyy-mm-dd')
您还可以设置会话参数 NLS_DATE_FORMAT
,以便所有日期在显示时自动以给定格式设置格式:
alter session set nls_date_format = 'yyyy-mm-dd';
我希望数据库中的所有日期都采用以下 yyyy-mm-dd 日期格式。例如,“2020-05-28”。但这似乎并没有像我想的那样工作,当我在我的用户 table 中插入一个包含生日列的日期时。
这是我的生日列约束:
birthday DATE NOT NULL CHECK (REGEXP_LIKE(birthday , '\d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])*')),
我在尝试插入时收到以下错误:“2020-05-28”或与此相关的任何其他日期:
02290. 00000 - "check constraint (%s.%s) violated"
*Cause: The values being inserted do not satisfy the named check
*Action: do not insert values that violate the constraint.
您错误地解释了 DATE
数据类型的概念。可能,您混合了日期的 显示格式 (当您显示 date
值时看到的值),以及它们的 内部表示 .
A date
就是:约会。它以某种数据库特定格式在内部存储,您无需担心。所以不需要检查约束来控制格式。
每当你需要显示日期时,你可以使用函数to_char()
将其格式化为字符串,如:
to_char(birthday, 'yyyy-mm-dd')
您还可以设置会话参数 NLS_DATE_FORMAT
,以便所有日期在显示时自动以给定格式设置格式:
alter session set nls_date_format = 'yyyy-mm-dd';