2017-04-12 38 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'是解决我的问题的解决方案。 –