如何使用PostgreSQL单独创建表?

时间:2017-04-12 11:08:05

标签: sql postgresql

假设我有这些简单的sql语句

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

仅在两个查询都完成时才创建两个表。

如果查询#2遇到任何错误(或者比查询#1花费的时间长得多),则不会创建表ab(或者表a也不会在查询#2结束之前一直存在)。

我希望有一种方法可以逐个创建表,也就是说,在创建表a之后,允许查询#2运行,因此表a将被保存(或者甚至查询#2遇到错误(或运行时间更长)。

我用几个关键字搜索了它,但是徒劳无功。任何解决方案?

2 个答案:

答案 0 :(得分:0)

如果您的连接启用了隐式事务,则所有语句都必须成功,否则它们将全部回滚。您可能知道它在操作数据时的工作方式(插入,更新等),但您可能没有意识到它也会在创建表和许多其他DDL命令时发生。

您可以通过以下方式避免此行为:

  1. 在每个CREATE TABLE命令后添加显式COMMIT
  2. 在会话中启用AUTOCOMMIT
  3. 许多DBMS仅将事务应用于数据操作,但有些像Postgres则不会。

答案 1 :(得分: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;

如果第一个表创建失败,第二个案例第一个表创建回滚