如何创建不允许任何其他字符的唯一约束?

时间:2018-11-13 22:45:53

标签: oracle oracle11g

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

ACTIVE  varchar2(1)

因此只能在该列中输入一个字符。现在,对于此列,

  • 一行中最多可以包含“ Y”值
  • 此外,还必须添加检查约束,以便只能在该列中输入“ Y”(以防止用户输入任何其他值)。

到目前为止,为了满足要求,我在该表上创建了一个索引:

create  unique index only_one_yes on myTestTab (case when upper(ACTIVE)='Y' then   'Y'  else '' end);

但是,它不会将小写的“ y”设置为大写的“ y”,并且可以接受任何其他字符,只要它是唯一的即可。我可以知道如何解决它吗?

1 个答案:

答案 0 :(得分:2)

  

它没有将小写的“ 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);