这个问题是我之前提出的一个过于简化的问题的扩展。更准确的示例在此 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 …
我有一个需要在 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) 我知道有人问过这个或类似的问题 在其他地方过。其他答案都没有对我有用。
机器是 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) 我有一个表,其目的是存储应用程序的各种图像。它是这样定义的:
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.id的102和104 …
我有一种情况,许多用户可以跨所有可用模式创建数据库对象。
所有开发人员都使用一个通用用户 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。
昨天我在 Windows XP 上安装了 PostgreSQL 9.0,安装后数据库正在运行。今天早上启动系统后,数据库服务器没有自动启动。
如何配置 Windows XP 以在每次启动/重新启动后启动 postgresql 恶魔?(我是一个 Unix 人,我猜这对于了解 Windows 的人来说很容易。)
我们的生产服务器在 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等?
通过使用 EXPLAIN 可以看到运行查询的成本。成本以人工单位为单位,它们基于预定义的参数。我相信,1 是一个磁盘提取,一个 CPU 周期是 0.01 个单位。我的问题是为什么 PostgreSQL 在安装时不会自动运行测试以确定基于硬件的实数?这不应该是一个明显的快速胜利吗?
我们有一个包含大约 7 亿个条目的单个表的数据库。我们通过在服务器上添加新条目来更新数据库,然后使用 pg_dump 将服务器传输到生产服务器:
pg_dump -c 数据库 > /tmp/database_gen
(顺便说一下,我们使用 postgres 8.4)我们使用 psql 将数据库导出到生产服务器。pg_dump 生成的文件有关于如何创建和填充表的说明。
问题出在索引创建上。Postgres 填充表,然后花费数天时间创建索引。没关系,直到 postgres 无法再创建索引,因为它没有更多的磁盘空间,因为它使用大量磁盘空间来存储临时文件以进行排序和创建索引。通常数据库需要大约 200GB,但在创建索引期间,使用的磁盘空间增加到 600GB,然后在创建后又回到 200GB。
我的问题是:我们可以分几个步骤创建索引,比如为一半的表创建索引,然后添加表的其余部分并更新索引?
有没有人有同样的问题?
谢谢
postgresql ×10
disk-space ×1
index ×1
join ×1
logs ×1
performance ×1
permissions ×1
tcpip ×1
windows ×1