使用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