如何编写一个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等.
我想在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中完成我想要的东西?
我已经习惯了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正在远程服务器上运行.任何的想法?
我试图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)
问题是每次执行批处理脚本时都要求输入密码.如何通过批处理文件密码参数?
是否有CREATE TABLE IF NOT EXISTS创建数据库的模拟?
背景:我正在编写一个脚本,以便在未知系统上自动设置PostgreSQL中的模式.我不确定数据库(或者甚至是模式的一部分)是否已经部署,所以如果某些结构已经存在,我想构建我的代码以使其失败(或理想情况下甚至显示错误).我想区分阻止我创建数据库的错误(因此中止未来的架构更改,因为它们不起作用)来自此错误.
我想更新 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
我想编写一个简单的查询来选择PostgreSQL中的多个列.但是,我一直在收到错误 - 我尝试了一些选项,但它们对我不起作用.目前我收到以下错误:
org.postgresql.util.PSQLException:错误:"列"或附近的语法错误
要获取具有值的列,请尝试以下操作:
select * from weather_data where column like '%2010%'
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我是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的新手,想要使用存储函数创建数据库.
例如:
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存储函数中的语句?
我有一个看起来像这样的函数:
BEGIN
DROP DATABASE IF EXISTS db_1;
END;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误:无法从函数或多命令字符串执行 DROP DATABASE。
是否无法从 PostgreSQL 的存储过程中删除数据库?我正在使用 plpgsql。
postgresql ×10
sql ×5
database ×3
dblink ×3
plpgsql ×3
ddl ×2
dynamic-sql ×2
transactions ×2
connection ×1
pgadmin-4 ×1
psql ×1
roles ×1
select ×1
shell ×1
sql-update ×1