微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

允许空值的最小长度约束

如何解决允许空值的最小长度约束

假设我们有以下表结构

Name                        Null?    Type          
--------------------------- -------- ------------- 
ID                          NOT NULL NUMBER(15)    
middle_name                          VARCHAR2(255) 

如何强制约束 middle_name 中插入的值必须具有最小长度,同时仍允许 null 值?

我尝试了以下约束

ALTER TABLE users
ADD CONSTRAINT check_middle_name CHECK (length(middle_name) > 1)
;

但是当我收到错误时,它似乎有空值问题

sql Error [2293] [23000]: ORA-02293: cannot validate (middle_name) - check constraint violated

解决方法

您的代码运行良好。 Here 是一个 dbfiddle,所以出了点问题。

wherewhen 子句中,NULL 结果未通过比较并被视为“false”。 CHECK 约束的工作方式不同;只有明确的“假”值违反约束。因此,NULL 值不会导致违规。

这是检查约束的 SQL 标准。这也是 Oracle 的工作方式。

除此之外,消除一个字符的中间名似乎是一个坏主意。毕竟,举个例子,Harry S Truman 的中间名只是“S”。

,

问题不是由该列中的 null 引起的。相反,您的表中已经存在违反约束的数据,并且该数据是 middle_name 长度为 1 的行。例如,您可能已经在列中包含“John F Kennedy”的“F”。

您必须决定如何处理那些违反您所需约束的现有值。您可以修复它们(将它们更改为 null 或更长的字符串),您可以保留它们并仅对未来的行强制执行约束。这很容易做到 - 在 novalidateadd constraint 子句末尾添加选项 alter table(就在分号之前)。

如果您使用 novalidate 选项添加约束,您仍然可以更新旧行,即使中间名是单个字母的行 - 只要您只更新 中的数据其他 列,则不应用约束。即使在旧行中,您也无法将中间名更新为单个字母;该列中的任何新值都必须遵守约束,即使“新值”适用于“旧行”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。