标签: postgresql

如何从 pg_dumpall 备份恢复所有内容(包括“postgres”角色)

我有一个 postgres 9.1 服务器正在运行,我用

pg_dumpall -c -f /nfs/backup/fulldump.sql
Run Code Online (Sandbox Code Playgroud)

我正在测试将备份恢复到另一台服务器

psql -f /nfs/backup/fulldump.sql
Run Code Online (Sandbox Code Playgroud)

以用户身份运行时postgres出现两个错误

psql:/nfs/backup/fulldump.sql:27: ERROR:  current user cannot be dropped
psql:/nfs/backup/fulldump.sql:36: ERROR:  role "postgres" already exists
Run Code Online (Sandbox Code Playgroud)

我知道这些是由命令引起的

DROP ROLE postgres;
CREATE ROLE postgres;
Run Code Online (Sandbox Code Playgroud)

在备份转储中。

是否有可能以某种方式恢复转储pg_dumpall -c而不会出现任何错误?

postgresql backup restore errors

7
推荐指数
1
解决办法
5429
查看次数

查询中的 PostgreSQL 分区不起作用

所以我有一个真正的休息日什么的,但对于我的生活,我无法弄清楚这一点。我想分tier1total获得总数的百分比。我是这样想的:

(tier1 / total) as per
Run Code Online (Sandbox Code Playgroud)

但没有运气。我将这些 CAST 作为 int 并且仍然没有。我会得到一个错误并且查询不会执行,或者我会得到一个值 0。

这是我正在尝试使用的内容:

SELECT count(student_id) as total
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 1) as tier1
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 2) as tier2
,(SELECT count(fall_september_tier) FROM national_assessments.aimsweb WHERE general_outcome_measure = 'PSF' AND fall_september_tier = 3) as tier3
FROM national_assessments.aimsweb
WHERE general_outcome_measure = 'PSF' AND fall_september_tier IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

我也有这个想法,但没有运气:

SELECT tier1,total, tier1/total as test …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate datatypes count

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

CTE 按预期工作,但在包装到函数中时不工作

--testing table
CREATE TABLE public.test_patient_table (
                entity_id INTEGER NOT NULL,
                site_held_at INTEGER NOT NULL,
                CONSTRAINT entityid_pk PRIMARY KEY (entity_id)
);

CREATE TABLE public.test_messageq_table (
                entity_id VARCHAR NOT NULL,
                master_id INTEGER NOT NULL,
                message_body VARCHAR NOT NULL,
                CONSTRAINT mq_entity_id_pk PRIMARY KEY (entity_id)
);

CREATE INDEX test_patient_table_siteid_idx
 ON public.test_patient_table
 ( site_held_at );

ALTER TABLE public.test_messageq_table
ADD CONSTRAINT test_patient_table_test_messageq_table_fk
FOREIGN KEY (master_id)
REFERENCES public.test_patient_table (entity_id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE;

--test patient data
insert into test_patient_table values (1, …
Run Code Online (Sandbox Code Playgroud)

postgresql stored-procedures cte plpgsql

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

ST_GeomFromGeoJSON() 导致 postgres 崩溃

我遇到了一个我无法解决的奇怪问题。服务器在执行一些 postgis 相关查询时崩溃。一些调试后,使用实例 提供由PostGIS的,它出现在ST_GEOMFROMGeoJSON()函数引起服务器崩溃。

崩溃:

SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}')) As wkt;
Run Code Online (Sandbox Code Playgroud)

运行正常:

SELECT ST_AsText(
         ST_Transform(
               ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,
                                         743265 2967450,743265.625 2967416,743238 2967416))',2249)
         ,4326)
        ) As wgs_geom; 
Run Code Online (Sandbox Code Playgroud)

查看日志时,我发现这些条目与崩溃相关:

2014-11-21 11:27:46 CET LOG:  server process (PID 2377) was terminated by signal 11: Segmentation fault
2014-11-21 11:27:46 CET DETAIL:  Failed process was running: SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}')) As wkt;
2014-11-21 11:27:46 CET LOG:  terminating any other active server processes
2014-11-21 11:27:46 CET WARNING:  terminating connection because of crash of another server process
2014-11-21 …
Run Code Online (Sandbox Code Playgroud)

postgresql spatial postgis postgresql-9.3

7
推荐指数
1
解决办法
649
查看次数

如何计算Postgres中行之间的累积差异?

我需要根据 session_id 计算 Postgres 中前一天累积值的差异。示例如下:

CREATE TEMP TABLE foo AS
SELECT date::date, session_id, upload_usage, download_usage, total_usage_on_a_day
FROM ( VALUES
  ( '10/21/2014', '0007994b', 37578561   , 6800209   , 44378770 ),
  ( '10/22/2014', '0007994b', 218113296  , 85272007  , 303385303 ),
  ( '10/23/2014', '0007994b', 552228616  , 252390680 , 804619296 ) ,
  ( '10/24/2014', '0007994b', 799772020  , 391196041 , 1190968061 ),
  ( '10/25/2014', '0007994b', 1047233978 , 529908804 , 1577142782 ),
  ( '10/26/2014', '0007994b', 1294608258 , 668515778 , 1963124036 ),
  ( '10/27/2014', '0007994b', 1066656794 , 557318645 …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

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

将函数参数添加到 SQL 查询 WHERE 子句

我在 Java 中有一个 Web 应用程序,它使用查询。我不想把查询写成Java,所以我做了一个函数:

CREATE OR REPLACE FUNCTION testFunc(inputs text) RETURNS TABLE(...) AS 
$$
    SELECT .... FROM ...
    JOIN ...
    where true
    ;
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

我希望函数参数 INPUTS 也位于 WHERE 子句中,因此如果输入是

AND speed = 0 AND ....
Run Code Online (Sandbox Code Playgroud)

Where 子句看起来像

where true AND speed = 0 AND ... 
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑

也可以接受许多参数(a int、b string、c string ..)但是我需要有

WHERE speed = * AND stop = * AND ...
Run Code Online (Sandbox Code Playgroud)

这是不可接受的。我怎样才能做到这一点?

或者我可以在里面放一个 if 语句吗?喜欢

Select .. . from ...
JOIN ... 
WHERE true
IF (a …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql java functions

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

递归 CTE 以找到独特的 slug

我有一个文章表,我希望 slug 是独一无二的。

CREATE TABLE article (
   title char(50) NOT NULL,
   slug  char(50) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

当用户输入标题时,例如News on Apple,我想检查数据库以查看是否存在相应的 slug,例如news-on-apple。如果是这样,我将给一个数值添加后缀,直到找到一个唯一的值,例如news-on-apple-1. 可以通过递归 CTE 查询而不是在我的 ORM 中进行递归来实现。是否有一个很好的大概数字,我应该停止递归和出错。我可以想象人们使用相同的标题 1000 次,这将导致 1000 次查询只是为了创建 1 篇文章。

我对递归 CTE 的理解可能是不正确的,并且没有更好的方法来找到唯一的 slug。请提出任何替代方案。

postgresql database-design cte recursive

7
推荐指数
1
解决办法
1715
查看次数

绕过约束“列必须出现在 GROUP BY 子句中或用于聚合函数中”

我正在使用 Postgres,它强制执行 SELECT...GROUP BY 中的所有列必须出现在 GROUP BY 子句中或在聚合函数中使用的约束。

假设我正在为人们的汽车建模,我想算出一个人的姓名、牌照号码以及他们拥有的汽车数量。这是我作为SQL Fiddle 的示例。

我会有以下架构:

CREATE TABLE person(
  id integer PRIMARY KEY,
  name text
);

CREATE TABLE license(
  person_id integer REFERENCES person(id),
  expiry_date date
);

CREATE TABLE car(
  owner_id integer REFERENCES person(id),
  registration_number TEXT
);
Run Code Online (Sandbox Code Playgroud)

这是查询:

SELECT person.name, person.id, license.expiry_date, COUNT(car) FROM person
  JOIN license ON license.person_id = person.id
  JOIN car ON car.owner_id = person.id
WHERE person.name = 'Charles Bannerman'
GROUP BY person.id;
Run Code Online (Sandbox Code Playgroud)

知道,因为我自己的业务逻辑,一个人只能有一个license,所以当我加入这个人的时候,即使是GROUP BY'd,我应该可以找到他们的license number。但是,因为它不是 GROUP …

postgresql join aggregate group-by

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

针对多个值的 PostgreSql JSONB SELECT

我有一个非常简单的 JSON 表,其中填充了一些示例数据:

CREATE TABLE jsonthings(d JSONB NOT NULL);

INSERT INTO jsonthings VALUES ('{"name":"First","tags":["foo"]}');
INSERT INTO jsonthings VALUES ('{"name":"Second","tags":["foo","bar"]}');
INSERT INTO jsonthings VALUES ('{"name":"Third","tags":["bar","baz"]}');
INSERT INTO jsonthings VALUES ('{"name":"Fourth","tags":["baz"]}');

CREATE INDEX ON jsonthings USING GIN(d);
Run Code Online (Sandbox Code Playgroud)

并且在运行SELECT. SELECT获取值为单个项目的行的简单方法工作正常:

SELECT d FROM jsonthings WHERE d @> '{"name":"First"}';
Run Code Online (Sandbox Code Playgroud)

但是当尝试运行匹配多个值的查询时,name我无法找到如何使用索引。我试过了:

SELECT d FROM jsonthings WHERE d->>'name' = ANY(ARRAY['First', 'Second']);
SELECT d FROM jsonthings WHERE d->'name' ?| ARRAY['First', 'Second'];
SELECT d FROM jsonthings WHERE d#>'{name}' ?| ARRAY['First','Second'];
Run Code Online (Sandbox Code Playgroud)

并且所有这些都显示了对表的顺序扫描(enable_seqscan=false如果可能,我正在使用强制使用索引)。有什么方法可以重写查询以便它使用索引?我知道我可以这样做: …

postgresql json postgresql-9.4

7
推荐指数
2
解决办法
9414
查看次数

如何在 PostgreSQL 中禁用参数值的日志记录

有没有办法禁用查询中使用的参数值的日志记录,同时仍然记录实际查询本身?

我想设置log_min_duration_statement = 0为与 pgBadger 一起使用。每个查询我得到两行,例如:

LOG: Select * from table where id = $1

DETAIL: parameters: $1 = 55
Run Code Online (Sandbox Code Playgroud)

我真的很想压制 DETAIL行,因为它我的日志膨胀并保存敏感信息。

是否可以从 Postgres 中禁用它?

postgresql configuration logging

7
推荐指数
1
解决办法
4420
查看次数