触发唯一列

时间:2016-10-20 15:36:42

标签: sql oracle triggers

我想创建一个触发器,如果​​它有一个前一个条目,其中一个字段设置为一个值,则无法添加或更新条目。

让我们举一个例子:

鉴于下表:

id  name          type,    description, (some other fields)
 1  'Manuel'      'HUMAN'  ...
 2  'Manuel'      'DOG'    ...
 3  'Other name'  'HUMAN'  ...

如果我想添加这样的新条目:

insert into table_name (name, type, description,...)
values ('Manuel', 'HUMAN', 'first entry', ...)

它不应该起作用,因为不应该允许为名称HUMAN添加另一个Manuel类型。

但是,应该允许这样做:

insert into table_name (name, type, description, ...) values ('Manuel', 'DOG', 'another description')

所以,基本上这个想法是,对于每个名称,它应该只允许一个HUMAN条目类型。

我创建了这个触发器,但它无效:

CREATE OR REPLACE TRIGGER TABLE_TYPE_REL
BEFORE INSERT OR UPDATE ON table_name
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
WHEN (NEW.TYPE = 'HUMAN')
declare @check int

select @check = count(*)
from table_name as f
where f.type = 'HUMAN'

if @check <> 0
begin
    rollback transaction
    raiserror('Only one name, human is allowed.', 16, 1)
end

有任何线索吗?

1 个答案:

答案 0 :(得分:4)

您的代码表明您使用的是Oracle。您发布的触发器代码适用于SQL Server。我将假设您实际上正在使用Oracle,并且您的触发器“无效”的原因是它是用错误的语言编写的(另外,包含错误堆栈而不是说某些东西“不起作用”真的很有帮助“)

听起来你想要一个基于函数的索引,它只包含type='HUMAN'

的行
CREATE UNIQUE INDEX idx_one_human
    ON table_name( CASE WHEN type = 'HUMAN'
                        THEN name
                        ELSE null
                    END );
相关问题