使用Postgresql。触发器过程的一致性(在行触发器之前)Postgresql
我尝试使用TRIGGER过程对INSERT进行一些一致性检查。
的问题是......
是否 “BEFORE INSERT FOR EACH ROW” 可以确保每一行插入 “检查” 和 “插入” 一个又一个?我是否需要额外的表锁来保持并发插入?
检查新ROW1 - >插入ROW1 - >检查新2行 - >插入2行
--
--
-- unexpired product name is unique.
CREATE TABLE product (
"name" VARCHAR(100) NOT NULL,
"expired" BOOLEAN NOT NULL
);
CREATE OR REPLACE FUNCTION check_consistency() RETURNS TRIGGER AS $$
BEGIN
IF EXISTS (SELECT * FROM product WHERE name=NEW.name AND expired='false') THEN
RAISE EXCEPTION 'duplicated!!!';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_check_consistency
BEFORE INSERT ON product
FOR EACH ROW EXECUTE PROCEDURE check_consistency();
--
INSERT INTO product VALUES("prod1", true);
INSERT INTO product VALUES("prod1", false);
INSERT INTO product VALUES("prod1", false); // exception!
这是确定
name | expired
==============
p1 | true
p1 | true
p1 | false
这也不行
name | expired
==============
p1 | true
p1 | false
p1 | false
或者我应该问, 我该如何使用Trigger来实现“主”或“唯一”约束式SQL。
不要使用触发器,速度太慢,不可靠:许多交易可以看到在选择相同的结果,因此所有交易没问题,你的数据不会是(部分)唯一的。 – 2010-04-07 06:38:29