相关疑难解决方法(0)

如果不存在,请创建PostgreSQL ROLE(用户)

如何编写一个SQL脚本来在PostgreSQL 9.1中创建一个ROLE,但如果它已经存在则不会引发错误?

当前脚本只有:

CREATE ROLE my_user LOGIN PASSWORD 'my_password';
Run Code Online (Sandbox Code Playgroud)

如果用户已存在,则会失败.我喜欢这样的东西:

IF NOT EXISTS (SELECT * FROM pg_user WHERE username = 'my_user')
BEGIN
    CREATE ROLE my_user LOGIN PASSWORD 'my_password';
END;
Run Code Online (Sandbox Code Playgroud)

...但是这不起作用 - IF在纯SQL中似乎不支持.

我有一个批处理文件,可以创建PostgreSQL 9.1数据库,角色和其他一些东西.它调用psql.exe,传入要运行的SQL脚本的名称.到目前为止,所有这些脚本都是纯SQL,我想尽可能避免使用PL/pgSQL等.

sql postgresql roles dynamic-sql

96
推荐指数
11
解决办法
8万
查看次数

如何在PostgreSQL中进行大型非阻塞更新?

我想在PostgreSQL中对表进行大量更新,但我不需要在整个操作中维护事务完整性,因为我知道我正在更改的列不会被写入或读取更新.我想知道psql控制台中是否有一种简单的方法可以更快地完成这些类型的操作.

例如,假设我有一个名为"orders"的表,有3500万行,我想这样做:

UPDATE orders SET status = null;
Run Code Online (Sandbox Code Playgroud)

为避免被转移到offtopic讨论,让我们假设3500万列的所有状态值当前都设置为相同(非空)值,从而使索引无用.

此语句的问题是需要很长时间才能生效(仅因为锁定),并且所有更改的行都将被锁定,直到整个更新完成.此更新可能需要5个小时,而类似

UPDATE orders SET status = null WHERE (order_id > 0 and order_id < 1000000);
Run Code Online (Sandbox Code Playgroud)

可能需要1分钟.超过3500万行,执行上述操作并将其分成35块只需要35分钟,节省了4小时25分钟.

我可以用脚本进一步分解它(在这里使用伪代码):

for (i = 0 to 3500) {
  db_operation ("UPDATE orders SET status = null
                 WHERE (order_id >" + (i*1000)"
             + " AND order_id <" + ((i+1)*1000) " +  ")");
}
Run Code Online (Sandbox Code Playgroud)

此操作可能仅在几分钟内完成,而不是35分钟.

所以这归结为我真正的要求.我不想写一个怪异的脚本来分解操作,每次我想做这样一个大的一次性更新.有没有办法在SQL中完成我想要的东西?

postgresql dblink transactions plpgsql sql-update

61
推荐指数
3
解决办法
3万
查看次数

如何在PostgreSQL中使用(安装)dblink?

我已经习惯了Oracle并在我的架构中创建了一个dblink,然后访问了这样一个远程数据库:mytable@myremotedb那么对于PostgreSQL有没有相同的做法?

现在我正在使用这样的dblink:

SELECT logindate FROM dblink('host=dev.toto.com
                              user=toto
                              password=isok
                              dbname=totofamily', 'SELECT logindate FROM loginlog');
Run Code Online (Sandbox Code Playgroud)

当我执行此命令时,我收到以下错误:

提示:没有函数匹配给定的名称和参数类型.您可能需要添加显式类型转换.

有人有想法吗?我们是否必须"激活"dblinks或在使用它们之前做些什么?

我们要查询的远程数据库有什么问题吗?我们还要激活dblink吗?我一直都有could not establish connection.这是行类型:

SELECT dblink_connect_u('host=x.x.x.x dbname=mydb user=root port=5432');
Run Code Online (Sandbox Code Playgroud)

IP地址正确,Postgres正在远程服务器上运行.任何的想法?

sql postgresql dblink

56
推荐指数
4
解决办法
13万
查看次数

使用不带密码的psql命令运行批处理文件

我试图psql使用批处理脚本执行此命令:

psql --host=localhost --dbname=<dbname> --port=<Port Number>
     --username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt
Run Code Online (Sandbox Code Playgroud)

问题是每次执行批处理脚本时都要求输入密码.如何通过批处理文件密码参数?

postgresql connection shell psql

26
推荐指数
1
解决办法
4万
查看次数

如果不存在Postgres数据库创建

是否有CREATE TABLE IF NOT EXISTS创建数据库的模拟?

背景:我正在编写一个脚本,以便在未知系统上自动设置PostgreSQL中的模式.我不确定数据库(或者甚至是模式的一部分)是否已经部署,所以如果某些结构已经存在,我想构建我的代码以使其失败(或理想情况下甚至显示错误).我想区分阻止我创建数据库的错误(因此中止未来的架构更改,因为它们不起作用)来自此错误.

sql database postgresql ddl

12
推荐指数
1
解决办法
2万
查看次数

如何批量更新 postgres 中的单个列 5500 万条记录

我想更新 postgres 表的一列。记录大约有 5500 万条,因此我们需要批量更新 10000 条记录。注意:我们要更新所有行。但我们不想锁定我们的桌子。

我正在尝试以下查询 -

Update account set name = Some name where id between 1 and 10000
Run Code Online (Sandbox Code Playgroud)

我们如何为每 10000 条记录更新创建一个循环?

任何建议和帮助将不胜感激。

PostgreSQL 10.5

sql postgresql plpgsql

9
推荐指数
2
解决办法
1万
查看次数

在PostgreSQL中选择具有特定列名称的列

我想编写一个简单的查询来选择PostgreSQL中的多个列.但是,我一直在收到错误 - 我尝试了一些选项,但它们对我不起作用.目前我收到以下错误:

org.postgresql.util.PSQLException:错误:"列"或附近的语法错误

要获取具有值的列,请尝试以下操作:

select * from weather_data where column like '%2010%'
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

sql database postgresql select dynamic-sql

6
推荐指数
2
解决办法
2万
查看次数

Postgres中的“如果不存在则创建数据库”

我是PostgreSQL的新手,我正在尝试创建一个架构文件,该文件将包含创建数据库和所需表所需的所有脚本。我以前对SQl服务器执行此操作的方法是检查数据库是否存在,然后运行必要的脚本。

PostgreSQL中的以下脚本引发错误,指出“无法从函数或多命令字符串执行CREATE DATABASE”

do $$
begin
If not exists (select 1 from pg_database where datname = 'TestDB')
Then
 CREATE DATABASE "TestDB";
end if;
end
$$
Run Code Online (Sandbox Code Playgroud)

我通过导出数据库备份创建了一个postgres数据库转储文件,但其中包含,

Drop Database "TestDB"

Create Database "TestDB"
Run Code Online (Sandbox Code Playgroud)

这意味着每次我运行架构文件时,都会删除并重新创建数据库,如果数据库中存在数据,那将是一个问题。

如何检查数据库是否存在于postgreSQL中,而不必每次运行文件时都删除数据库并重新创建数据库?

提前致谢

postgresql postgresql-9.3 pgadmin-4

6
推荐指数
1
解决办法
4497
查看次数

使用存储的函数创建数据库

我是PostgreSQL的新手,想要使用存储函数创建数据库.
例如:

CREATE OR REPLACE FUNCTION mt_test(dbname character varying)
  RETURNS integer AS
$BODY$

Create Database $1;

Select 1;

$BODY$
  LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

当我尝试执行此函数时,我收到语法错误.

Postgres是否支持CREATE DATABASE存储函数中的语句?

database postgresql transactions stored-functions

5
推荐指数
2
解决办法
1万
查看次数

从 PostgreSQL 中的存储过程删除或创建数据库

我有一个看起来像这样的函数:

BEGIN
  DROP DATABASE IF EXISTS db_1;
END;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:无法从函数或多命令字符串执行 DROP DATABASE。

是否无法从 PostgreSQL 的存储过程中删除数据库?我正在使用 plpgsql。

postgresql ddl stored-procedures dblink plpgsql

5
推荐指数
1
解决办法
7446
查看次数