Oracle 如何创建赢得';不允许任何其他字符?

Oracle 如何创建赢得';不允许任何其他字符?,oracle,oracle11g,Oracle,Oracle11g,我正在使用Oracle 12c。我有一个名为myTestTab的表,该表有一个名为“active”的列。该列定义为 ACTIVE varchar2(1) 因此,该列中只能输入一个字符。那么这个专栏呢, 最多只能有一行可以包含值“Y” 此外,必须添加检查约束,以便在该列中只能输入“Y”(以防止用户输入任何其他值) 到目前为止,为了满足要求,我在该表上创建了一个索引,如下所示: create unique index only_one_yes on myTestTab (case when

我正在使用Oracle 12c。我有一个名为myTestTab的表,该表有一个名为“active”的列。该列定义为

ACTIVE  varchar2(1)
因此,该列中只能输入一个字符。那么这个专栏呢,

  • 最多只能有一行可以包含值“Y”
  • 此外,必须添加检查约束,以便在该列中只能输入“Y”(以防止用户输入任何其他值)
到目前为止,为了满足要求,我在该表上创建了一个索引,如下所示:

create  unique index only_one_yes on myTestTab (case when upper(ACTIVE)='Y' then   'Y'  else '' end);
但是,它并没有将小写字母“y”设置为大写字母“y”,并且它接受任何其他字符,只要它是唯一的。我能知道怎么修吗

它没有将小写字母“y”设置为大写字母“y”

你还没告诉它。您的唯一索引最多允许一个
'y'
'y'
值,但索引不会更改进入表中的数据。为此,您需要使用触发器,例如:

CREATE OR REPLACE TRIGGER biu_myTestTab_active_uc
  BEFORE INSERT OR UPDATE ON myTestTab
  FOR EACH ROW
BEGIN
  :new.active := UPPER(:new.active);
END;
/
。。。它接受任何其他字符,只要它是唯一的

实际上,它接受任何其他字符,不管它是否唯一。如果愿意,您可以插入
'X'
五次,索引不会阻止您。同样,这不是您定义的索引所能做到的。正如您在问题中提到的,您需要的是检查约束:

ALTER TABLE myTestTab ADD CONSTRAINT active_yes_or_null CHECK (active = 'Y' OR active IS NULL);

实际上,奇怪的是,在
约束中,如果条件
为TRUE
为UNKNOWN
,则条件是“满足的”,因此不需要单独处理
NULL
<代码>检查(活动='Y')
就足够了。(尽管……为了清楚起见,最好还是明确地说出来。)