我正在编写一个从parent表中返回单个记录的查询。如果它有任何孩子,我也想在这个查询中返回。这是一对多的关系。
parent:
-parent_id
-name
child:
-child_id
-name
-parent_id
Run Code Online (Sandbox Code Playgroud)
我的第一直觉是编写以下查询:
select name, (select count(child_id) from child c where c.parent_id=p.parent_id) children
from parent p
where name like 'some name'
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更有效的方法来做到这一点,因为我实际上并不关心计数,只关心它是否有孩子。任何指针?
我在 Linux 机器上设置了 postgres 10.4,有时在 pg_hba.conf 顶部会随机出现一些规则,只允许用户“pgdbadm”进行 MD5 连接。我不确定数据库是否被黑,但在更改密码并检查 pgdbadm 不存在后,我仍然不时看到新规则。数据库是否有可能被泄露?
如果我没记错的话,这三个规则如下:
local all all 0.0.0.0/0 reject
host all postgres 0.0.0.0/0 reject
host all pgdbadm 0.0.0.0/0 md5
Run Code Online (Sandbox Code Playgroud)
任何关于正在发生的事情的解释以及潜在的解决方案将不胜感激。
编辑:我发现在设置 pg_hba.conf 时我使用了一个规则,所有连接都不需要密码。这可能允许机器人登录并创建不需要的数据库/其他东西,所以我将全新安装 Ubuntu 并备份数据库。
有什么方法可以在 postgresql 中获取主机名/服务器名,例如 SQL Server 中的 @@ServerName?
如果我在 Postgres 表中有一堆行,然后创建一个索引,如果在创建后插入新数据行,索引是否会自动更新?
或者说,REINDEX 是仅在一些罕见的情况下需要,还是在添加新数据时才需要?
我们在 PostgreSQL 的单个事务中执行大约 100k DDL 语句。在执行过程中,各个 Postgres 连接的内存使用量逐渐增加,一旦它无法获得更多内存(在 3GB 内存上从 10MB 使用量增加到 2.2GB),OOM 杀手用 9 命中它,导致 Postgres 进入恢复模式.
BEGIN;
CREATE SCHEMA schema_1;
-- create table stmts - 714
-- alter table add pkey stmts - 714
-- alter table add constraint fkey stmts - 34
-- alter table add unique constraint stmts - 2
-- alter table alter column set default stmts - 9161
-- alter table alter column set not null stmts - 2405
-- alter table add check …Run Code Online (Sandbox Code Playgroud) postgresql performance transaction ddl postgresql-9.6 postgresql-performance
最近apgcc,在我们测试的 Aurora Postgresql 集群(欧盟西部地区)的每个数据库中都出现了一个名为的神秘新模式。它归rdsadmin帐户所有。它是什么,它来自哪里?
我知道东京地区apgcc的发布公告中提到了。Twitter透露,这也发生在其他人身上。
Postgresql 有一些有趣的监控工具,用于监控新的逻辑复制系统的进度,但我不是很了解它们。我知道的两个工具是:
pg_stat_replication
Run Code Online (Sandbox Code Playgroud)
它是兄弟姐妹:
pg_stat_subscription
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这些文档,但他们没有说明如何知道副本是否实际同步,并且解释这些表对我来说似乎并不明显。有人可以解释一下吗?
我正在尝试在 Postgres 中创建一个函数,该函数可以遍历给定jsonb对象中的每个键/值对。
create or replace function myFunction
(input jsonb)
returns jsonb as $$
BEGIN
// foreach(key in input)
// do some math operation on its corresponding value
returns input;
END; $$
Run Code Online (Sandbox Code Playgroud)
参数输入应为 jsonb 对象,例如{"a":1, "b":2, "c":3}.
我想遍历对象中的每个键/值对。从我的评论中可以看出,我曾经使用更通用的编程语言(如 c、java 等)编写后端代码。所以我不擅长 SQL。我曾尝试在线搜索,但他们谈论如何遍历jsonb数组而不是对象。所以真的卡在这里了。
我无法让我的第一个存储过程工作,所以我从手册中复制了这个例子:
CREATE PROCEDURE insert_data(a integer, b integer)
LANGUAGE SQL
AS $$
INSERT INTO tbl VALUES (a);
INSERT INTO tbl VALUES (b);
$$;
CALL insert_data(1, 2);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near "PROCEDURE" LINE 1: CREATE PROCEDURE insert_data(a integer, b integer) ^ SQL state: 42601 Character: 8
我究竟做错了什么?
我在本地主机上运行数据库,以管理员用户身份运行。我自己安装的。安装过程无错误完成,我能够创建表、函数、触发器等。
psql 13.2 退出编辑器时,无论退出编辑器后如何,都会执行查询缓冲区 - 在这种情况下,缓冲区现在可能保存最近执行的 SQL 查询。
重现:
vim使用\e或\e filename从psql控制台启动编辑器(在我的情况下)。:q(或:q!强制)预期行为:回到启动编辑器之前的状态。(我取消了编辑!)
观察到的行为:重新执行上次执行的 SQL 查询。
似乎发生了什么\e:
它执行(相当于)\p,因此当前查询缓冲区包含前一个命令,当它为空时。(编辑文件时用户看不到!)
手册\p :
\p或者将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则打印最近执行的查询。
启动编辑器。如果提供了文件名,则加载文件,否则加载查询缓冲区。
如果编辑器以写入结束,则将结果复制到查询缓冲区。
如果编辑被取消(:q在 vim 中),不要覆盖查询缓冲区。(它现在保存了之前的命令!)
执行查询缓冲区。或者,准确地说,这样做:
行为似乎可以\p(只是复制查询缓冲区,没有造成任何伤害),但不能\e执行,它可以执行我什至没有看到的命令。
这是一个错误吗?
无论哪种方式,我至少想在离开编辑器时禁用自动执行。但这似乎不可能。或者我错过了什么?
postgresql ×10
performance ×3
amazon-rds ×1
aurora ×1
ddl ×1
errors ×1
json ×1
plpgsql ×1
psql ×1
replication ×1
transaction ×1