我在回答这个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 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 函数的执行类似于事务。但是,当我尝试在函数中“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 秒。
请告知为什么这两种情况不同,以及我如何纠正它以在函数内设置语句超时。
我正在为一个应用程序编写一个安装脚本,该脚本是另一个应用程序的插件,所以我想检查另一个应用程序的表是否存在。如果没有,我想给用户一个有用的错误。但是,我不知道什么模式将保存这些表。
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 9.4 中可能吗?
(另一种方法是创建实际表,但它们更难“刷新”)
我有一个 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)
我试过这个,但SELECT在COUNT语句中出现错误。任何想法我怎么能做到这一点?我确定 Postgres 中有一个超级简单的方法。我只是想不出 Google 的正确术语。
我无权访问 Postgres 安装,因此无法检查。
我是一名安全人员,我在日志中看到了明文密码:
create user user1 with password 'PLAINTEXT PASSWORD'
Run Code Online (Sandbox Code Playgroud)
在日志中没有明文密码的情况下,DBA 如何更改或创建他们的密码?
我见过这个,它指出您可以使用密码的 md5 散列,但散列也是明文。有没有更好的办法?
我不得不用一个简短的脚本执行一些测试来更新我的一个表中的一些“遗留”数据。
尽管我很谨慎,但使用未经测试的脚本,我决定在这样做之前备份相关表。最简单的方法是:
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) 在包含 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) 我知道FOR EACH STATEMENT当我执行一个UPDATE t ....
现在,什么时候用t定义FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE,我更新 N 行a,这会导致触发器被调用一次还是 N 次?
换句话说,对由 FK 约束级联的表的更改更像是单个UPDATE,还是更像是一系列UPDATEs?
postgresql ×10
aggregate ×1
catalogs ×1
foreign-key ×1
functions ×1
logs ×1
password ×1
pg-dump ×1
plpgsql ×1
psql ×1
timestamp ×1
timezone ×1
transaction ×1
trigger ×1