2017-04-12 39 views
0

假設我有這些簡單的SQL語句創建如何使用PostgreSQL分別創建表?

CREATE TABLE a AS (SELECT 1); -- query #1 
CREATE TABLE b AS (SELECT 2); -- query #2 

兩個表,只有當這兩個查詢都完了。

如果查詢#2運行到任何錯誤(或需要比查詢#1更長的時間),既不表a也不b將被創建(或表a不會存在,那麼,直到查詢#2完成)。

我希望有創建表格逐一的方式,就是在創建表a後,再查詢#2允許運行,表a因此將被保存(或存在)甚至查詢#2運行進入錯誤(或需要更長時間才能運行)。

我用幾個關鍵字搜索了它,但徒勞無功。任何解決方案

+1

1)不使用循環2)向我們展示的結構中的表格3)向我們展示您的功能4)向我們展示您的(預期的)結果5)不要使用循環 – wildplasser

+0

@wildplasser謝謝。我在尋求一個通用的解決方案。你能告訴我PSQL是否可以運行一個零件並輸出結果並運行另一個並輸出相應的結果? –

+0

一般的解決方案是1)不使用循環2)向我們顯示您的代碼 – wildplasser

回答

0

如果您的連接啓用了隱式事務,則所有語句都必須成功,否則它們將全部回滾。你可能知道在操作數據(插入,更新等)時它是如何工作的,但是你可能沒有意識到它也發生在創建表和許多其他的DDL命令上。

您可以通過避免此行爲:

  1. 添加一個顯式COMMIT之後在每個CREATE TABLE命令
  2. 打開AUTOCOMMIT在會話

許多數據庫管理系統只適用於交易數據的操作,但有些像Postgres那樣。

+0

謝謝,'COMMIT'是我正在尋找的解決方案。如果我回顧「COMMIT」這個詞,我可能會更清楚地描述我的問題。 –

0

我假設你在談論交易? 成功:

t=# begin; 
BEGIN 
t=# create table so56(i int); 
CREATE TABLE 
t=# create table so57 as select * from pg_tables limit 1; 
SELECT 1 
t=# end; 
COMMIT 
t=# select * from so56; 
i 
--- 
(0 rows) 

不成功

t=# begin; 
BEGIN 
t=# create table so56(i int); 
CREATE TABLE 
t=# select * from so56; 
i 
--- 
(0 rows) 

t=# create table so57 as select * from not_existing_table_to_raise_error; 
ERROR: relation "not_existing_table_to_raise_error" does not exist 
LINE 1: create table so57 as select * from not_existing_table_to_rai... 
             ^
t=# end; 
ROLLBACK 
t=# select * from so56; 
ERROR: relation "so56" does not exist 
LINE 1: select * from so56; 
如果

秒情況下,第一個創建表的回滾第一個表創建失敗

+0

'開始'開始一個事務嗎?沒有它,表'so56'不會回滾? –

+0

是的。這意味着 –

+0

感謝您的回答,'COMMIT'是解決我的問題的解決方案。 –