首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用PostgreSQL分别创建表?

如何使用PostgreSQL分别创建表?
EN

Stack Overflow用户
提问于 2017-04-12 11:08:05
回答 2查看 43关注 0票数 0

假设我有以下简单的sql语句

代码语言:javascript
复制
CREATE TABLE a AS (SELECT 1); -- query #1
CREATE TABLE b AS (SELECT 2); -- query #2

这两个表只有在两个查询都完成时才会创建。

如果查询#2遇到任何错误(或比查询#1花费更长的时间),则不会创建表ab (或者在查询2完成之前不会出现表a )。

我希望有一种逐个创建表的方法,即在创建表a之后,允许运行查询#2,因此将保存(或存在)表a,甚至查询#2也会出现错误(或运行时间要长得多)。

我用几个关键词搜索了它,但没有用。有解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-12 13:56:44

如果连接已打开隐式事务,则所有语句都必须成功,否则将全部回滚。您可能知道,在操作数据(插入、更新等)时,它就是这样工作的。但您可能没有意识到,在创建表和许多其他DDL命令时也会出现这种情况。

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

  1. 在每个CREATE命令之后添加显式提交
  2. 在您的会话中打开AUTOCOMMIT

许多DBMS只将事务应用于数据操作,但有些DBMS不应用于Postgres。

票数 0
EN

Stack Overflow用户

发布于 2017-04-12 13:59:25

我想你说的是事务?成功的

代码语言:javascript
复制
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)

不成功

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43367877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档