触发以确保列中的唯一值

时间:2014-05-11 10:40:59

标签: postgresql plpgsql

我必须编写一个触发器来确保表account的{​​{1}}列中的唯一条目:

accounts

我试着像这样编写我的触发器:

   create table accounts (id serial, account int4 default 0);

或者:

create function x_6 () returns trigger as '

begin
    IF row(new.account) is distinct from row(OLD.account) THEN
       return NEW;

    ELSE
       raise notice '' Entries are not unique! '';
    END IF;
end;
'
language 'plpgsql';

然后

create function x_6 () returns trigger as '                         
begin
    IF (new.account <> OLD.account) THEN
       return NEW;

    ELSE
       raise notice ''  Entries are not unique ! '';
    END IF;
end;
'
language 'plpgsql';

当我尝试插入某些内容时:

 create trigger x_6t before insert on accounts for each row execute procedure x_6();

在任何一种情况下我都会收到错误:

insert into accounts(account) values (20);

我该如何解决?

1 个答案:

答案 0 :(得分:2)

这绝对是错误的方式。您不应该为此目的使用触发器,您应该使用唯一索引

CREATE TABLE foo(a int PRIMARY KEY, b int);
-- column b has only unique values
CREATE UNIQUE INDEX ON foo(b);

您的代码有多个问题:

  • 错误的标识符 - konto而不是帐户
  • 它是表触发器 - 你没有任何数据访问权限 - PostgreSQL触发器与MSSQL不同
  • 如果使用行触发器,可以访问记录数据,则OLD具有与您预期不同的含义。它是更改前记录的值 - 此值仅为UPDATE或DELETE操作定义 - 并且INSERT未定义,因为以前的记录值不存在。