CREATE DATABASE无法在事务块内运行。

61

我正在使用 AWS 服务器和 PostgreSQL。当我执行创建数据库的查询时,出现错误:

CREATE DATABASE cannot run inside a transaction block

我正在使用Linux Ubuntu 12.04 LTS。

我该如何解决这个问题?


1
查询本身将成为问题非常有帮助的补充。仅从消息中,我只能假设您尝试在事务中创建数据库。如果是这样,那么您的数据库创建逻辑上应该在事务之前。 - Zero
1
嗨,我对postgraSQL非常陌生。这是我第一次开始使用postgraSQL。我已经搜索了相同的错误,但是在过去的两天中,我一直面临着这个问题。您的评论对我来说相当难以理解。 - Nikunj K.
3
“我该如何解决这个问题?” - 打开自动提交选项。具体方法视使用的 SQL 客户端而定。 - user330315
嗨 @a_horse_with_no_name,谢谢你宝贵的评论。我必须打开自动提交,并且那个创建命令正在运行。 - Nikunj K.
7个回答

18

我已经在PostgreSQL中使用了自动提交(autocommit)并且它对我有效。

下面是打开自动提交的查询语句:

SET AUTOCOMMIT = ON

请注意,这仅适用于PostgreSQL 9.4及以下版本


6
在DBeaver中,点击“编辑连接”(F4),勾选“自动提交”复选框。 - redacted
4
那个参数已经很久没有起作用了:https://dev59.com/9pzha4cB1Zd3GeqPD1yK#40546968 - Millie Smith
1
@MillieSmith,那不正确。你提到的链接是关于客户端库在其自己的API中弃用参数的讨论。Postgres支持设置自动提交行为。这是当前的文档:https://www.postgresql.org/docs/current/ecpg-sql-set-autocommit.html - mcbex
11
从PostgreSQL 9.5版本开始,这与之无关。 - Jagrut Trivedi
参考其他答案 - 自Postgres 7.4以来,此选项已被弃用。 https://dev59.com/9pzha4cB1Zd3GeqPD1yK - Alfishe
显示剩余3条评论

9

注意,对于PostgreSQL 9.5+,您需要使用:

psql -c '\set AUTOCOMMIT on'

但是我猜想,您真正想做的是在一个命令中销毁数据库并重新创建它。以下是您需要的命令:

printf '\set AUTOCOMMIT on\ndrop database <your_db_here>; create database <your_db_here>; ' |  psql postgres

5

使用psql,您还可以通过使用多个--command参数在一个命令中运行drop和create数据库:

psql postgres -c "drop database if exists <your_db_here>;" -c "create database <your_db_here>;"

3
在Postgres SQL 14.1中,使用pgAdmin查询工具时,当运行与其他查询一起的create database查询时,我看到了相同的错误。仅运行create database查询则可以成功完成。

0

如果在 create table 块内部有注释行,也可能会出现这种情况。

问题代码:

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    first_name VARCHAR(30),
    last_name VARCHAR(30) NOT NULL,
    date_of_birth DATE
-- managers INT FOREIGN KEY,
-- employees INT FOREIGN KEY,
-- companies INT FOREIGN KEY
);


解决方案:

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    first_name VARCHAR(30),
    last_name VARCHAR(30) NOT NULL,
    date_of_birth DATE
);

-- managers INT FOREIGN KEY,
-- employees INT FOREIGN KEY,
-- companies INT FOREIGN KEY

0
我在尝试在一个Python程序中执行PostgreSQL脚本时遇到了这个问题:
with psycopg2.connect(
   dbname=database, host=server, port=port, user=user, password=password
) as connection:  
    connection.autocommit = True

解决问题的方法是我将它改成了:
connection = psycopg2.connect(
    dbname=database, host=server, port=port, user=user, password=password
) 
connection.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)

-2

我使用了查询工具并得到了您的错误信息。为了解决这个问题,我打开了PSQL工具,然后创建了我的数据库。

  1. sudo su - postgres

  2. psql -d postgres -U postgres

  3. create database dbName;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接