如何解决允许空值的最小长度约束
假设我们有以下表结构
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,所以出了点问题。
在 where
和 when
子句中,NULL
结果未通过比较并被视为“false”。 CHECK
约束的工作方式不同;只有明确的“假”值违反约束。因此,NULL
值不会导致违规。
这是检查约束的 SQL 标准。这也是 Oracle 的工作方式。
除此之外,消除一个字符的中间名似乎是一个坏主意。毕竟,举个例子,Harry S Truman 的中间名只是“S”。
,问题不是由该列中的 null
引起的。相反,您的表中已经存在违反约束的数据,并且该数据是 middle_name
长度为 1 的行。例如,您可能已经在列中包含“John F Kennedy”的“F”。
您必须决定如何处理那些违反您所需约束的现有值。您可以修复它们(将它们更改为 null
或更长的字符串),或您可以保留它们并仅对未来的行强制执行约束。这很容易做到 - 在 novalidate
的 add constraint
子句末尾添加选项 alter table
(就在分号之前)。
如果您使用 novalidate
选项添加约束,您仍然可以更新旧行,即使中间名是单个字母的行 - 只要您只更新 中的数据其他 列,则不应用约束。即使在旧行中,您也无法将中间名更新为单个字母;该列中的任何新值都必须遵守约束,即使“新值”适用于“旧行”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。