2012-05-02 65 views
0

我有唯一約束的表中標記爲DEFERRABLE INITIALLY DEFERRED;PostgreSQL的遞延約束和開始結束塊

然後我執行一個查詢:

START TRANSACTION; 
INSERT INTO "T" VALUES (1,2); 
INSERT INTO "T" VALUES (1,2); 
INSERT INTO "T" VALUES (1,2); 
ROLLBACK; 

而且一切順利。但如果我嘗試執行

START TRANSACTION; 
BEGIN; 
    INSERT INTO "T" VALUES (1,2); 
    INSERT INTO "T" VALUES (1,2); 
    INSERT INTO "T" VALUES (1,2); 
END; 
ROLLBACK; 

我收到一個錯誤。爲什麼在退出BEGIN END塊時Postgres強制約束檢查?交易結束時不應該檢查限制嗎?我怎樣才能改變這種行爲?

回答

1

ENDCOMMIT的代名詞作爲記錄在手冊中:

http://www.postgresql.org/docs/current/static/sql-end.html

所以在第一個例子中,你開始一個事務,插入衝突行,做一個回滾。

在你開始交易的第二個例子,然後你開始另外一個(因爲BEGINSTART TRANSACTION的同義詞),然後試圖通過運行END提交的插入,然後你回滾。

+0

第二次啓動事務的嘗試應該已經表明它對此警告沒有影響:警告:已經有一個正在進行的事務。 – kgrittn

+0

哇。我應該如何創建批處理命令? – Yavanosta

+0

@ Yavanosta:「批處理命令」是什麼意思? –