在`INSERT`语句之前自动操作行

时间:2014-08-17 05:20:00

标签: postgresql triggers

我正在寻找一种在将行添加到postgreSQL中的表之前自动操作行的方法。比方说我们有下表:

CREATE TABLE foo (
  id serial NOT NULL,
  value integer NOT NULL,
  CONSTRAINT "Foo_pkey" PRIMARY KEY (id),
  CONSTRAINT "Foo_value_check" CHECK (value >= 0)
)

现在可以插入行:

INSERT INTO foo (id,value) VALUES ('0','2')

当一个人进入时:

INSERT INTO foo (id,value) VALUES ('1','-2')

将发生错误。是否可以定义" 重写规则"给定value列包含小于零的值,使用零(例如)?

1 个答案:

答案 0 :(得分:4)

是的,有可能。一种方法是使用触发器。触发器会导致在特定操作上运行过程,这可以允许您修改要插入的数据(以及其他内容)。

要设置触发器,首先要创建一个将执行所需检查和修改的函数。函数中的变量new将被隐式声明,并包含要插入/更新的新行,以便您可以在值到达表之前检查和修改它们。

然后指定在一个或多个表上插入或更新之前调用此函数。

示例:

CREATE FUNCTION validate_foo_row()
RETURNS TRIGGER AS $$
BEGIN
  IF new.value<0 THEN
     new.value=0;
  END IF;
  RETURN NEW;
END
$$ LANGUAGE 'plpgsql';

CREATE TRIGGER trig_validate_foo BEFORE INSERT ON foo 
    FOR EACH ROW EXECUTE PROCEDURE validate_foo_row();

SqlFiddle Here

以上简单示例仅触发插入,您可能还希望触发更新。

您可以阅读有关触发器in the postgresql manual的更多信息。它们很强大,并且能够比这个简单的例子显示更多。