标签: postgresql

将多个时间线的两个事件表合并为一个结果集

这个问题是我之前提出的一个过于简化的问题的扩展。更准确的示例在此 SQLFiddle中演示,我演示了一个有效(但速度较慢)的解决方案,然后尝试将先前的答案调整为实际问题。

实际问题是因为这两个表包含多个时间线的事件。

CREATE TABLE foo (ts int, id text, foo text);
INSERT INTO foo (ts, id, foo)
VALUES
    (1, 'A', 'Lorem'),
    (1, 'B', 'ipsum'),
    (4, 'B', 'dolor'),
    (5, 'A', 'sit'),
    (8, 'A', 'amet'),
    (8, 'B', 'consectetur');

CREATE TABLE bar (ts int, id text, bar text);
INSERT INTO bar (ts, id, bar)
VALUES
    (1, 'A', 'adipiscing'),
    (5, 'B', 'elit'),
    (6, 'A', 'sed'),
    (9, 'B', 'do ');
Run Code Online (Sandbox Code Playgroud)

每个表都有时间线“A”和“B”的事件。目标是将结果组合成单个结果集,显示每个时间线的“状态”。两条时间线是正交的。

ts id foo 栏
1 Lorem adipiscing …

postgresql join window-functions

5
推荐指数
1
解决办法
948
查看次数

在 Postgres 8.4 中实现为 Postgres 9.4 编写的函数

我有一个需要在 Postgres 8.4 上实现的简单函数(在 Postgres 9.4 上测试过)。我得到的错误是函数格式不存在。我一直在努力寻找资源,但 8.4 在这个阶段已经 6 岁了,除了文档之外很难找到相关信息!

CREATE OR REPLACE FUNCTION create_table()
  RETURNS void AS
$BODY$
DECLARE
    rows RECORD;

BEGIN
    FOR rows IN SELECT column as tablename from table
        LOOP
            EXECUTE format('
               CREATE TABLE IF NOT EXISTS %I (
                date date,
                number integer
               )', rows.tablename);

        END LOOP ;
    RETURN;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

ERROR:  function format(unknown, text) does not exist
LINE 1: SELECT  format('
                ^
HINT:  No function matches the given name and argument …
Run Code Online (Sandbox Code Playgroud)

postgresql

5
推荐指数
1
解决办法
650
查看次数

如果我指定主机 localhost,psql 会中断

我知道有人过这个或类似的问题 其他地方。其他答案都没有对我有用。

机器是 Macbook Pro 2014 / OS X Yosemite 10.10,通过 Homebrew 安装了 Postgres 9.3.5。

如果我没有指定主机,我只能连接到我的本地 postgres 实例。这有效:

psql -Umyuser -d mydb
sql (9.4.4)
Type "help" for help.

myuser=# 
Run Code Online (Sandbox Code Playgroud)

-h localhost 才不是:

psql -Umyuser -d mydb -h localhost
psql: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.
Run Code Online (Sandbox Code Playgroud)

在我收到这条消息之前,它暂停了很长时间。

我正在尝试设置一个似乎想要指定 localhost 的第三方工具,因此不能仅将其关闭。

如果我理解我在其他地方正确阅读的内容,那么如果您使用 TCP/IP 并指定-h localhost强制使用,则 postgres 的行为会有所不同。因此,我在 中添加了以下内容pg_hba.conf

local   all …
Run Code Online (Sandbox Code Playgroud)

postgresql tcpip postgresql-9.3

5
推荐指数
1
解决办法
2891
查看次数

批量删除行时不要拒绝整个语句

我有一个表,其目的是存储应用程序的各种图像。它是这样定义的:

CREATE TABLE images
(
  id lo NOT NULL,
  name character varying(1024) NOT NULL,
  type character varying(32) NOT NULL,
  dimension point,
  last_modified timestamp without time zone NOT NULL DEFAULT now(),
  CONSTRAINT "PK_images" PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

其他一些表有外键引用images.id,如果图像在某处被引用,则不应删除该约束(即应用程序负责首先正确删除引用);

...
CONSTRAINT "FK_foo_image" FOREIGN KEY (image_id)
   REFERENCES images (id) MATCH SIMPLE
   ON UPDATE CASCADE ON DELETE RESTRICT
...
Run Code Online (Sandbox Code Playgroud)

由于许多表格行可能引用相同的图像,我需要自动清理不再有任何引用的图像。

我的第一个想法是实现应用程序以删除所有外键引用,然后删除与这些已删除外键的值匹配的所有图像。为此,我会images在删除之前在表上创建一个触发器,如果仅删除“孤立”图像之类的查询而其他查询将被静默忽略,则可以“吞下”所有约束异常。我只是不确定如何正确地做到这一点。

如果这个想法不好,还有什么其他(如果不是更好的话)替代方案?

基本上,如果我正在执行这样的查询

DELETE FROM images WHERE id IN (101, 102, 103, 104, 105)
Run Code Online (Sandbox Code Playgroud)

images.id102104 …

postgresql postgresql-9.4

5
推荐指数
1
解决办法
1447
查看次数

Reg:PostgreSQL 模式的默认权限

我有一种情况,许多用户可以跨所有可用模式创建数据库对象。

所有开发人员都使用一个通用用户 pg_dump_user 在需要时将整个数据库转储到他们的本地数据库。所以这个用户应该拥有对所有数据库对象的读取权限。

为了实现这一点,我尝试在架构级别和用户级别设置默认权限。

--为每个模式设置的默认权限

ALTER DEFAULT PRIVILEGES IN SCHEMA xyz GRANT SELECT ON TABLES to ro_user';
Run Code Online (Sandbox Code Playgroud)

--为每个用户设置的默认权限

ALTER DEFAULT PRIVILEGES FOR ROLE abc_user GRANT SELECT ON TABLES to ro_user' ;
Run Code Online (Sandbox Code Playgroud)

即使上面的设置存在,在某些时间之后这些都会消失,因为 ro_user 无法访问创建的新对象。

任何关于此的指针都会有所帮助,我的目标只是为用户实现对当前和未来所有对象的选择访问,以便执行 pg_dump。

postgresql permissions default-value

5
推荐指数
1
解决办法
2881
查看次数

如何配置 PostgreSQL 9.0 在 Windows XP 下自动启动?

昨天我在 Windows XP 上安装了 PostgreSQL 9.0,安装后数据库正在运行。今天早上启动系统后,数据库服务器没有自动启动。

如何配置 Windows XP 以在每次启动/重新启动后启动 postgresql 恶魔?(我是一个 Unix 人,我猜这对于了解 Windows 的人来说很容易。)

postgresql windows

4
推荐指数
1
解决办法
8903
查看次数

如何在没有转储/恢复的情况下升级 PostgreSQL 次要版本?

我们的生产服务器在 CentOS5.2 上运行 PostgreSQL v8.2.3。我们计划升级到 8.2 系列的最新版本,即v8.2.20。此外,在未来,我们计划尽快升级到最新的次要版本(当 PostgreSQL 发布时)。

最初,我们从源代码安装了 v8.2.3。PostgreSQL 安装在/usr/local/pgsql/ 中,数据目录位于/usr/local/pgsql/data

PostgreSQL版本控制政策说:

升级到次要版本不需要转储和恢复;只需停止数据库服务器,安装更新的二进制文件,然后重新启动服务器即可。

现在,在没有转储/恢复的情况下,将 PostgreSQL 升级到次要版本的最新版本所涉及的推荐方法/步骤是什么?

编辑:嗯,我应该这样问我的问题。由于文档说install the updated binaries,我的问题是是否可以按原样安装最新版本。我的数据目录/usr/local/pgsql/data/会以任何方式受到干扰吗?或者应该暂时移动这个数据目录,直到最新的安装完成。另外,有什么吗,作为管理员,我需要注意,比如备份/usr/local/pgsql/data/postgresql.conf等?

postgresql

4
推荐指数
1
解决办法
2314
查看次数

让 PostgreSQL 运行测试来调整成本参数有多难?

通过使用 EXPLAIN 可以看到运行查询的成本。成本以人工单位为单位,它们基于预定义的参数。我相信,1 是一个磁盘提取,一个 CPU 周期是 0.01 个单位。我的问题是为什么 PostgreSQL 在安装时不会自动运行测试以确定基于硬件的实数?这不应该是一个明显的快速胜利吗?

postgresql performance

4
推荐指数
1
解决办法
129
查看次数

Postgres 中的索引生成

我们有一个包含大约 7 亿个条目的单个表的数据库。我们通过在服务器上添加新条目来更新数据库,然后使用 pg_dump 将服务器传输到生产服务器:

pg_dump -c 数据库 > /tmp/database_gen

(顺便说一下,我们使用 postgres 8.4)我们使用 psql 将数据库导出到生产服务器。pg_dump 生成的文件有关于如何创建和填充表的说明。

问题出在索引创建上。Postgres 填充表,然后花费数天时间创建索引。没关系,直到 postgres 无法再创建索引,因为它没有更多的磁盘空间,因为它使用大量磁盘空间来存储临时文件以进行排序和创建索引。通常数据库需要大约 200GB,但在创建索引期间,使用的磁盘空间增加到 600GB,然后在创建后又回到 200GB。

我的问题是:我们可以分几个步骤创建索引,比如为一半的表创建索引,然后添加表的其余部分并更新索引?

有没有人有同样的问题?

谢谢

postgresql index disk-space

4
推荐指数
1
解决办法
1282
查看次数

PostgreSQL:更改日志文件位置

如何更改 PostgreSQL 中日志文件的位置?可以在不停止集群的情况下完成吗?

postgresql logs

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