我有一个 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而不会出现任何错误?
所以我有一个真正的休息日什么的,但对于我的生活,我无法弄清楚这一点。我想分tier1由total获得总数的百分比。我是这样想的:
(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) --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) 我遇到了一个我无法解决的奇怪问题。服务器在执行一些 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) 我需要根据 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) 我在 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) 我有一个文章表,我希望 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。请提出任何替代方案。
我正在使用 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 …
我有一个非常简单的 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如果可能,我正在使用强制使用索引)。有什么方法可以重写查询以便它使用索引?我知道我可以这样做: …
有没有办法禁用查询中使用的参数值的日志记录,同时仍然记录实际查询本身?
我想设置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 中禁用它?