标签: postgresql

带有区域名称 PostgreSQL 错误的“AT TIME ZONE”?

我在回答这个stackoverflow问题时发现了奇怪的结果:

 select * from  pg_timezone_names where name = 'Europe/Berlin' ;
     name      | abbrev | utc_offset | is_dst 
---------------+--------+------------+--------
 Europe/Berlin | CET    | 01:00:00   | f
Run Code Online (Sandbox Code Playgroud)

和下一个查询

select id, 
  timestampwithtimezone, 
  timestampwithtimezone at time zone 'Europe/Berlin' as berlin, 
  timestampwithtimezone at time zone 'CET' as cet 
from data ;
 id  | timestampwithtimezone  |       berlin        |         cet         
 -----+------------------------+---------------------+---------------------
 205 | 2012-10-28 01:30:00+02 | 2012-10-28 01:30:00 | 2012-10-28 00:30:00
 204 | 2012-10-28 02:00:00+02 | 2012-10-28 02:00:00 | 2012-10-28 01:00:00
 203 | 2012-10-28 02:30:00+02 …
Run Code Online (Sandbox Code Playgroud)

postgresql timestamp timezone

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

选择最长的连续序列

我正在尝试在 PostgreSQL 9.0 中构建一个查询,该查询获取特定列的最长连续行序列。

考虑下表:

lap_id (serial), lap_no (int), car_type (enum), race_id (int FK)
Run Code Online (Sandbox Code Playgroud)

lap_no每个(race_id, car_type). where都是独一无二的。

我希望查询为给定的race_idand生成最长的序列car_type,因此它将返回int最高的(或长的)。

使用以下数据:

1, 1, red, 1
2, 2, red, 1
3, 3, red, 1
4, 4, red, 1
5, 1, blue, 1
6, 5, red, 1
7, 2, blue, 1
8, 1, green, 1
Run Code Online (Sandbox Code Playgroud)

对于car_type = red and race_id = 1查询将5作为lap_no字段的最长序列返回。

我在这里发现了一个类似的问题但是我的情况更简单一些。

(我也想知道car_type …

postgresql window-functions gaps-and-islands postgresql-9.0

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

为什么“SET LOCAL statement_timeout”在 PostgreSQL 函数中不能按预期工作?

我的理解是 PostgreSQL 函数的执行类似于事务。但是,当我尝试在函数中“SET LOCAL statement_timeout”时,它不起作用。以下是它在事务中的工作方式:

BEGIN; 
  SET LOCAL statement_timeout = 100; 
  SELECT pg_sleep(10); 
COMMIT;
Run Code Online (Sandbox Code Playgroud)

结果在哪里(如预期的那样):

BEGIN
SET
ERROR:  canceling statement due to statement timeout
ROLLBACK
Run Code Online (Sandbox Code Playgroud)

但是,如果我将相同的命令放在函数体中:

CREATE OR REPLACE FUNCTION test() RETURNS void AS '
    SET LOCAL statement_timeout = 100;
    SELECT pg_sleep(10);
' LANGUAGE sql;

SELECT test();
Run Code Online (Sandbox Code Playgroud)

超时不会发生,函数test()执行需要 10 秒。

请告知为什么这两种情况不同,以及我如何纠正它以在函数内设置语句超时。

postgresql transaction functions query-timeout

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

如何使用 PLPGSQL 确定当前 search_path 中是否存在表?

我正在为一个应用程序编写一个安装脚本,该脚本是另一个应用程序的插件,所以我想检查另一个应用程序的表是否存在。如果没有,我想给用户一个有用的错误。但是,我不知道什么模式将保存这些表。

DO LANGUAGE plpgsql $$
BEGIN
    PERFORM 1
    FROM
        pg_catalog.pg_class c
        JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE
        n.nspname = current_setting('search_path')
        AND c.relname = 'foo'
        AND c.relkind = 'r'; -- not sure if I actually need this or not...

    IF NOT FOUND THEN
        RAISE 'This application depends on tables created by another application';
    END IF;
END;
$$;
Run Code Online (Sandbox Code Playgroud)

但是,current_setting('search_path')返回"$user",public默认包含的 TEXT ,这不是很有用。

我唯一能想到的另一件事是尝试从表中选择并捕获异常。它可以完成这项工作,但我认为它不是很优雅,而且我读到它使用起来很昂贵(尽管在这种情况下可能没问题,因为我只运行一次?)。

postgresql plpgsql catalogs

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

是否可以使用其数据备份和恢复物化视图?

我有一些难以计算的物化视图,我希望能够使用实际存储的数据进行备份和恢复,而不是通过重新计算。

在 PostgreSQL 9.4 中可能吗?

(另一种方法是创建实际表,但它们更难“刷新”)

postgresql materialized-view pg-dump

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

在单个 SELECT 语句中返回多个范围的计数

我有一个 Postgres 数据库表foo,其中有一个score范围为 0 - 10的列。我想要一个查询来返回分数总数、0 到 3 之间的分数数、4 之间的分数数和 6,以及 7 到 10 之间的分数。类似于以下内容:

SELECT
  COUNT(*) as total,
  COUNT(
    SELECT * from foo where score between 0 and 3;
  ) as low,
  COUNT(
    SELECT * from foo where score between 4 and 6;
  ) as mid,
  COUNT(
    SELECT * from foo where score between 7 and 10;
  ) as high
FROM foo;
Run Code Online (Sandbox Code Playgroud)

我试过这个,但SELECTCOUNT语句中出现错误。任何想法我怎么能做到这一点?我确定 Postgres 中有一个超级简单的方法。我只是想不出 Google 的正确术语。

postgresql aggregate aggregate-filter

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

如何从日志中隐藏敏感信息,如明文密码?

我无权访问 Postgres 安装,因此无法检查。

我是一名安全人员,我在日志中看到了明文密码:

create user user1 with password 'PLAINTEXT PASSWORD'
Run Code Online (Sandbox Code Playgroud)

在日志中没有明文密码的情况下,DBA 如何更改或创建他们的密码?

我见过这个,它指出您可以使用密码的 md5 散列,但散列也是明文。有没有更好的办法?

postgresql logs password postgresql-9.3

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

使用 psql 和 --disable-triggers 恢复纯文本 pg_dump

我不得不用一个简短的脚本执行一些测试来更新我的一个表中的一些“遗留”数据。

尽管我很谨慎,但使用未经测试的脚本,我决定在这样做之前备份相关表。最简单的方法是:

pg_dump -a --file table.sql -t table database
Run Code Online (Sandbox Code Playgroud)

现在我做了我必须做的,检查了结果,发现它们很不令人满意。我心想:有一张桌子的备份我是多么幸运。

当我备份表格时,我已经被警告过:

pg_dump: NOTICE: there are circular foreign-key constraints among these table(s):
pg_dump:   table
pg_dump: You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.
pg_dump: Consider using a full dump instead of a --data-only dump to avoid this problem.
Run Code Online (Sandbox Code Playgroud)

我没有多想,但现在我们遇到了问题。实际上,有问题的表附加了多个触发器,我无法恢复 pg_restore 命令的table.sqlwith 选项--disable-triggers

如果我尝试以下命令,我会收到一条错误消息:

pg_restore -a -d database -t table -h localhost --disable-triggers table.sql
Run Code Online (Sandbox Code Playgroud)

即:

pg_restore: [archiver] …
Run Code Online (Sandbox Code Playgroud)

postgresql psql

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

为什么 SELECT * 比按名称选择所有列(以不同的列顺序)要快得多?

在包含 a、b、c、d、e、f、g、h、i、j、k 列的表上,我得到:

select * from misty order by a limit 25;
Time: 302.068 ms
Run Code Online (Sandbox Code Playgroud)

和:

select c,b,j,k,a,d,i,g,f,e,h from misty order by a limit 25;
Time: 1258.451 ms
Run Code Online (Sandbox Code Playgroud)

有没有办法让按列选择的速度一样快?

更新:

表上没有索引,新创建的

这是解释分析,似乎没有太大帮助:

explain analyze select * from misty order by a limit 25;

Limit  (cost=43994.40..43994.46 rows=25 width=190) (actual time=404.958..404.971 rows=25 loops=1)
->  Sort  (cost=43994.40..45731.11 rows=694686 width=190) (actual time=404.957..404.963 rows=25 loops=1)
     Sort Key: a
     Sort Method: top-N heapsort  Memory: 28kB
     ->  Seq Scan on misty  (cost=0.00..24390.86 rows=694686 width=190) (actual time=0.013..170.945 rows=694686 …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.2

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

如果操作是由带有 UPDATE CASCADE 的 FK 约束引起的,那么 FOR EACH STATEMENT 触发器多久执行一次?

我知道FOR EACH STATEMENT当我执行一个UPDATE t ....

现在,什么时候用t定义FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE,我更新 N 行a,这会导致触发器被调用一次还是 N 次?

换句话说,对由 FK 约束级联的表的更改更像是单个UPDATE,还是更像是一系列UPDATEs?

postgresql trigger foreign-key postgresql-9.2

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