标签: postgresql

是否有远程访问 PostgreSQL 数据库的超时选项?

我正在通过pgAdmin III 在远程 PostgreSQL 数据库上工作。在没有在 pgAdmin 中做任何事情的不长一段时间(比如 10-15 分钟)之后,连接会自动过期。因此,我收到一条错误消息,询问我是否要重新连接。这大约需要 10 秒。并且数据库结构崩溃了,所以我必须重新打开我之前打开的模式。

有没有办法在某处更改超时参数,以防止连接过期更长时间?

postgresql pgadmin postgresql-9.2 connectivity

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

调用函数,其中参数是(子)选择语句

我的函数接受一个int4作为参数并返回一个表:

SELECT * FROM test_function(545421); -- works fine

SELECT * FROM test_function(SELECT customerid
                            FROM tableX where id = 1); -- syntax error
Run Code Online (Sandbox Code Playgroud)

我怎样才能使这项工作?
服务器 PostgreSQL 9.3.1

postgresql subquery set-returning-functions

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

PostgreSQL 查询中的未知返回类型

以下查询有效:

SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);

a b
_ _
1 2
3 2
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用不同的列类型,例如varchar(255)

SELECT a, b
FROM unnest(ARRAY[(1,'hello'), (3,'world')])
AS t(a integer, b varchar(255));

ERROR:  42804: function return row and query-specified return row do not match
DETAIL:  Returned type unkown at ordinal position 2, but query expects text.
Run Code Online (Sandbox Code Playgroud)

似乎在第二种情况下,列类型被推断为unknown,而不会varchar(255)自动转换为。

如果可能,我如何使第二个示例工作并返回正确类型的列,如果可能没有警告并且不修改ARRAY[...]定义?

背景:我正在尝试使用psycopg2Python 模块提高大型批量插入操作的性能,该模块不支持在VALUES参数中使用多行。我在尝试其他一些方法时偶然发现了上面的例子。

postgresql datatypes type-conversion

10
推荐指数
2
解决办法
3368
查看次数

ON CONFLICT ON CONSTRAINT 失败,表示约束不存在

我正在尝试使用新的 Postgresql 9.5 upsert 功能。但出于某种原因,我的查询说约束不存在(当它存在时)。

我的查询是这样的

INSERT INTO journals (ext_ids, title) VALUES ('{"nlmid": "000"}', 'blah')
ON CONFLICT ON CONSTRAINT idx_nlmid_journal DO NOTHING;
Run Code Online (Sandbox Code Playgroud)

哪里idx_nlmid_journal是这样创造的jsonb领域唯一索引

CREATE UNIQUE INDEX idx_nlmid_journal ON public.journals ((ext_ids ->> 'nlmid'::text));
Run Code Online (Sandbox Code Playgroud)

我得到错误

ERROR: constraint "idx_nlmid_journal" for table "journals" does not exist
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

postgresql upsert postgresql-9.5

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

在 PostgreSQL 中不为不能为空的字段指定 NOT NULL 的后果是什么?

我有一个应用程序(数据存储在 PostgreSQL 中),其中表中的大多数字段始终不为空,但这些表的架构并未强制执行此操作。例如看看这个假表:

CREATE TABLE "tbl" (
    "id" serial,
    "name" varchar(40),
    "num" int,
    "time" timestamp
    PRIMARY KEY ("id"),
    UNIQUE ("id")
);
Run Code Online (Sandbox Code Playgroud)

此外namenum,time没有明确声明为NOT NULL,实际上它们是,因为强制执行发生在应用程序端。


我的感觉是应该改变它,但相反的是应用程序级别确保这里不能出现空值并且没有其他人手动修改表。

我的问题是:通过设置一个显式NOT NULL约束?

我们有一个很好的代码审查流程和一个相当好的文档,所以一些新人会提交打破这个限制的东西的可能性并不足以证明改变是合理的。

这不是我的决定,所以这正是我寻找其他理由的原因。在我看来,如果某些内容不能为空并且数据库允许您指定某些内容不为空 - 那就去做吧。特别是如果更改非常简单。

schema postgresql null

10
推荐指数
2
解决办法
2438
查看次数

PostgreSQL 如何对磁盘上的新记录进行物理排序(在主键上的集群之后)?

需要知道 PostgreSQL 如何在磁盘上订购记录。在这种情况下,我想利用文档中所述索引组合,据我所知,它使用位图来获取匹配的行并根据它们的物理位置返回它们。有问题的表已按其主键聚集在一起。

据我了解,在集群完成后,PostgreSQL 不会自动继续进行集群(尽管它确实记得它是根据某个索引进行集群的)。现在,由于这是主键,我想知道物理存储顺序是否会根据它(如果是真的,我想利用我们的优势来进行特定查询)。

综上所述,PostgreSQL 如何对其新记录进行排序,尤其是在聚类之后?

非常感谢!

postgresql index database-design clustered-index physical-design

9
推荐指数
1
解决办法
2292
查看次数

将一些表从一个 postgres 数据库复制到另一个

我有以下情况:我有三台机器运行 postgresql 数据库。一台机器保存客户端帐户信息(称为这台机器 C),另外两台机器保存客户端日志信息(称为 L1 和 L2)。拆分的原因是为了在多台机器上分开加载(所以一些客户端将日志信息发送到 L1,一些发送到 L2 ......也许还有一些时间 L3、L4,......)。

检索日志信息时,原则上我希望能够在 Ln 上的日志记录表和 C 上的客户帐户表之间进行 JOIN。实际上我不能这样做(即使我可以,我也希望以避免加载 C)。

我的想法是将 C 上的表复制到 L1、L2 中的每一个上,以便我可以进行连接。就来自 C 的表而言,C 是主表,L1、L2、... 是从表。但是对于 L1、L2 上的其他表,...这些机器是大师。它不完全是主-主复制,也不完全是主从。

是否可以说服 postgres(我正在运行 9.1)复制来执行此操作,或者如果没有其他软件包可以完成这项工作。作为最后的手段,我可​​以编写一些代码来定期同步表(我可以容忍一些延迟),但最好不要这样做!

提前致谢。

postgresql replication

9
推荐指数
1
解决办法
9008
查看次数

有效地存储不规则/重复间隔(想想日历/事件)

我正在开发一项服务,该服务依赖于用户能够接收他们自己选择的消息。这些消息在发送进行处理之前需要存储在某处。

现在我将它们存储在 postgres 数据库中,但我觉得它不能很好地扩展。

目前的布局是:

ID - MESSAGE - DATE - TIME
Run Code Online (Sandbox Code Playgroud)

DATE 和 TIME 字段保存应该发送消息进行处理的时间和日期。这不能很好地扩展,好像需要在每个月的第一个星期一发送一条消息,它会占用 12 倍的空间。

问题是我似乎无法找到另一种方式来表示何时应该发送消息进行处理?理想情况下,我希望能够在一行中表示每个日期。

我们也在讨论使用 Redis,但很快就决定不使用,因为我们需要 webfrontend 的数据库。

任何人都知道如何优化消息存储?如何表示何时应该发送消息进行处理?

我也愿意就如何解决这个问题提出任何其他建议。

postgresql database-design time

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

以最小的影响将外键更改为 ON DELETE CASCADE

我有一个已ON DELETE NO ACTION定义的现有外键。我需要将此外键更改为ON DELETE CASCADE. 我可以在交易中做到这一点:

begin;
alter table posts drop constraint posts_blog_id_fkey;
alter table posts add constraint posts_blog_id_fkey foreign key (blog_id) references blogs (id) on update no action on delete cascade;
commit;
Run Code Online (Sandbox Code Playgroud)

问题是该posts表很大(400 万行),这意味着验证外键可能需要很长的时间(我已经用数据库的副本对此进行了测试)。滴/添加外键获取的ACCESS EXCLUSIVEposts。因此,添加外键会在相当长的时间内阻止对表的所有访问,posts因为在发生约束验证时会持有锁。我需要执行在线迁移(我没有专门的停机时间窗口)。

我知道我可以执行2 个事务来帮助检查需要很长时间:

begin;
alter table posts drop constraint posts_blog_id_fkey;
alter table posts add constraint posts_blog_id_fkey foreign key (blog_id) references blogs (id) on update no action …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-key postgresql-9.5 online-operations

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

pgAdmin 4:如何在 Windows 中通过 SSH 隧道/接口建立连接

我安装了最新的 pgAdmin 4 (v2.1),但我发现(相关线程),目前,通过 SSH 隧道建立连接的唯一方法是使用另一个外部进程,pgAdmin 论坛中的一个示例说:

我设置了一个隧道,如下所示:

ssh -f dpage(at)hostname(dot)enterprisedb(dot)com -L 5999: hostname.enterprisedb.com:5432 -N
Run Code Online (Sandbox Code Playgroud)

(...) 我在 Mac 上运行,但同样的程序应该可以在 Linux 上运行。在 Windows 上,Putty iirc 中有一个隧道应用程序,但我不知道如何使用它。

我找到了一个简单的PuTTY 教程来使用 SSH Tunnel 建立连接

连接已建立,但看起来,当我尝试通过 pgAdmin 连接时,它失败或被拒绝(使用127.0.0.1:3306127.0.0.1:5432作为隧道的目的地)。为什么?

postgresql windows interface ssh pgadmin-4

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