我正在寻找一种在将行添加到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
列包含小于零的值,使用零(例如)?
答案 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();
以上简单示例仅触发插入,您可能还希望触发更新。
您可以阅读有关触发器in the postgresql manual的更多信息。它们很强大,并且能够比这个简单的例子显示更多。