标签: postgresql

使用 array_position() 函数从 pg_stats 获取列最常见的值

我正在尝试执行这个简单的查询,以检查某个值(1000)是否属于 Postgres 查询优化器使用的 MCV 列表:

SELECT array_position(most_common_vals, 1000) 
FROM pg_stats 
WHERE tablename = 'tenk1' 
AND attname = 'unique1';
Run Code Online (Sandbox Code Playgroud)

但收到以下错误消息:

ERROR:  function array_position(anyarray, integer) does not exist
Run Code Online (Sandbox Code Playgroud)

如何解决?

array_position()是此处描述的标准函数,以下语句按预期返回2

SELECT array_position('{1,2,3}', 2);
Run Code Online (Sandbox Code Playgroud)

postgresql performance datatypes array postgresql-performance

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

根据当前行和下一行之间的时间差进行过滤

我有一个具有以下结构的数据库表:

id     | created
-------+---------------
1      | 2018-07-23 00:01:00
2      | 2018-07-23 00:02:00
...
Run Code Online (Sandbox Code Playgroud)

现在我想返回与下一行的时间差大于 10 秒的所有行。

我尝试过使用 Postgres 窗口函数,但无法让它工作,例如

SELECT
  created, 
  created - lag(created, 1) OVER (ORDER BY created) delta
FROM tablename
where created - lag(created, 1)  OVER (ORDER BY created) > interval '10 seconds'
ORDER BY created;
Run Code Online (Sandbox Code Playgroud)

我得到的错误是我不允许在WHERE子句中使用窗口函数。如何做到这一点?

postgresql window-functions

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

将列设置为从另一个表中随机选择的值

考虑一下:

UPDATE dest
SET dest_col = (SELECT s.src_col FROM source s
                WHERE s.name = 'abc'
                ORDER BY random() LIMIT 1 OFFSET 0);
Run Code Online (Sandbox Code Playgroud)

我的目标:将每一行设置dest.dest_col为从子查询匹配的所有值中随机选取的值。

为了实现这一点,我添加了ORDER BY random() LIMIT 1. 但这是通过选择一个随机值一次,然后将其设置到dest.dest_col.

我尝试添加OFFSET 0(在其他答案中建议作为防止 Postgres 优化子查询的方法),但这似乎没有任何效果。

另请注意,我需要它才能在 GCP 上运行的 PostgreSQL 上工作。

postgresql google-cloud-sql

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

如何获取数据库中所有表中每个TEXT字段的最大字段值长度

我正在尝试获取有关数据库中数据的信息。我在几个表中有几列输入“TEXT”。我想执行一个查询,该查询将创建如下所示的结果:

|table_name|column_name|max_length|
-----------------------------------
|my_table  |name       |35        |
Run Code Online (Sandbox Code Playgroud)

我有查询来获取所有表和列:

SELECT table_name, column_name FROM information_schema.columns
WHERE table_schema = 'public' AND data_type = 'text'
ORDER BY table_name
Run Code Online (Sandbox Code Playgroud)

但我现在不知道如何遍历每个表和列以获得每列的最大长度。我确实有一个查询来获取特定列和表的最大长度:

SELECT 'my_table', 'name', MAX(LENGTH(name)) FROM my_table
Run Code Online (Sandbox Code Playgroud)

如何进行查询,根据查询结果动态获取最大长度以获取所有表和列?

postgresql dynamic-sql plpgsql

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

如何在 PostgreSQL 中的当前数据库上授予连接和创建权限?

查看文档后,我知道您可以使用以下命令授予连接和创建权限:

GRANT CREATE ON DATABASE <db_name> TO user;
GRANT CONNECT ON DATABASE <db_name> TO user;
Run Code Online (Sandbox Code Playgroud)

如何在不指定数据库名称的情况下授予当前数据库的这些权限?

我正在尝试编写一个脚本,每当我的应用程序创建新数据库时,该脚本将用于授予所有权限,因此我不知道编写脚本时的名称是什么。

postgresql permissions

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

只允许通过函数访问表,而不是直接通过查询访问表

我有一个表t和一些可以访问的函数t。例如:

create function list_t() returns setof t as $$
    select * from t;
$$ language sql stable;
Run Code Online (Sandbox Code Playgroud)

是否可以将角色权限定义为仅允许执行list_t(),而不允许普通SELECTUPDATE和查询DELETEINSERTt

我尝试了以下方法:

grant execute on all functions in schema public to my_user;
revoke all on t from my_user;
Run Code Online (Sandbox Code Playgroud)

虽然这确实不允许SELECT * FROM t,但也不允许SELECT list_t()

postgresql permissions role acl

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

如何使用 pgAdmin 4 编辑 `postgresql.conf`?

与此相同的问题:How to edit postgresql.confwith pgAdmin 3? 但更新为全新的(完全重写)pgAdmin 4

\n\n

\xe2\x9e\xa5 如何使用pgAdmin 4应用程序编辑配置文件?

\n\n
    \n
  • postgresql.conf
  • \n
  • pg_hba.conf
  • \n
\n\n

我添加了adminpack扩展,如此处所述。我重新启动了pgAdmin 4。然而我无法识别任何菜单项或其他界面项来编辑此文件。

\n

postgresql configuration pgadmin-4

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

在 macOS 上将用户切换到“postgres”用户会导致“su:抱歉”错误

EnterpriseDB.com 向社区提供的Postgres 安装程序通常会在macOSpostgres上创建一个用户帐户。

\n\n

在Terminal.app的控制台会话中,我需要切换到该用户。我的目标是使用该 user\xe2\x80\x99s 权限运行文本编辑器,以便我可以编辑pg_hba.conf控制 Postgres 用户身份验证规则的文件。

\n\n

当我尝试时:

\n\n
su - postgres\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 系统提示我输入用户密码,我输入成功,但收到错误消息:

\n\n
\n

苏:对不起

\n
\n\n

我确信密码是正确的。我可以做什么来访问该postgres用户?

\n

postgresql permissions users

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

将 postgres 数组转换为 jsonb

我们如何将 postgres 数组 :- 转换ARRAY['{"id": "1"}', '{"id": "2"}']为 JSONB'[{"id": "1"}, {"id": "2"}]'

postgresql

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

如何防止现有行/记录的更新但允许使用 PostgreSQL 触发器插入?

如何防止给定表中任何记录的更新,但允许插入,我已经创建了一个阻止更新的触发器,但我发现它也阻止插入。

编辑
我可以从数据库本身插入新行/记录,但不能从连接到该数据库的应用程序的新记录的表单中插入新行/记录,提交表单后,正在执行触发器。

它是一个使用 Django 构建的 Web 应用程序。

触发功能

CREATE OR REPLACE FUNCTION prevent_updte()
RETURNS trigger AS
$BODY$
BEGIN
RAISE EXCEPTION 'Data modification not allowed';
END;
$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

扳机

CREATE Trigger prevent_update
BEFORE UPDATE ON purchases_purchase
FOR EACH ROW
EXECUTE PROCEDURE prevent_update();
Run Code Online (Sandbox Code Playgroud)

postgresql trigger

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