我正在使用Oracle 12c。我有一个名为myTestTab的表,该表有一个名为“活动”的列。该列定义为
ACTIVE varchar2(1)
因此只能在该列中输入一个字符。现在,对于此列,
到目前为止,为了满足要求,我在该表上创建了一个索引:
create unique index only_one_yes on myTestTab (case when upper(ACTIVE)='Y' then 'Y' else '' end);
但是,它不会将小写的“ y”设置为大写的“ y”,并且可以接受任何其他字符,只要它是唯一的即可。我可以知道如何解决它吗?
答案 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);