标签: postgresql

如果行已更新,则更新列值的函数

我正在尝试创建一个函数,如果我更新数据库行的任何列,它将增加我的版本列值 (int)。例如,如果我有一个包含列(id、标题、版本)并且默认版本为 1 的 foo 表,我希望我的 vesrion 在我更新单个 foo 行的标题后增加。我编写了以下函数,但是一旦我测试它就会抛出错误:

create or replace function update_foo_version()
returns trigger as $body$
  begin
    update foo
    set version = version::int + 1
    where old.id=new.id;
    return new;
  end
$body$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)

我对这个功能的触发器:

create trigger update_version 
after update on foo
for each row execute procedure update_foo_version();
Run Code Online (Sandbox Code Playgroud)

postgresql trigger

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

数据加载后将 PostgreSQL 表设置为 LOGGED

我创建了一个空UNLOGGED表来更快地复制大量数据(超过 10 亿行)。加载数据大约需要 4 个小时。

现在我想将表设置LOGGED为使其在意外关闭和崩溃时安全。这个过程需要很长时间。事实上,它比加载数据花费的时间更长。这是正常的,还是有办法加快速度?

postgresql postgresql-9.6 unlogged-tables

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

我是否需要每次都执行“创建扩展 pgcrypto”?

crypt()在我的一个函数中使用了哈希用户密码。但是我在第二天启动我的电脑时观察到,同样的事情失败了,因为密码功能在重新启动时变得不可用。它显示消息,如功能gen_salt()/crypt()未知或未定义。我执行了create extension pgcrypto;一次,它开始工作。

如何在生产环境中处理这个?即使 db 重新启动,有没有办法使该模块在 db 中永久可用?

或者我是否必须指示服务器管理器运行此命令以防他们需要重新启动数据库服务器?

或者我可以在函数本身中编写此语句,以便每次使用加密函数之前都会创建扩展?

此外,我们正在使用 db 的读取副本,它不允许执行此“创建扩展”语句,因为只有读取权限。那么如何在这样的只读环境中使用这种加密功能呢?

postgresql pgcrypto read-only-database postgresql-extensions

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

在多列上调用 SELECT DISTINCT

我不清楚确切地,

SELECT DISTINCT col1, col2, ...
FROM table_name
Run Code Online (Sandbox Code Playgroud)

当对一列调用时,它只返回该列的不同值。当我们将它与多个列一起使用时会发生什么,我们应该这样做吗?

postgresql distinct

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

如何在 AWS Aurora Postgres 上启用强制 ssl?

在 AWS 提供 RDS Postgres 的直接 postgres 中,您可以通过将参数组项设置rds.force_ssl为 1来要求 SSL 。

这是根据 RDS postgres 文档:https : //docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.SSL

但是Aurora Postgres没有这个参数项,也没有添加新参数的能力。如何为 Aurora 实例开启 require ssl?

我可以在 Aurora 版本中看到它支持 SSL:

create extension sslinfo;
select ssl_is_used();
select ssl_cipher();
Run Code Online (Sandbox Code Playgroud)

我可以选择通过 ssl 连接:

psql -h my-ssl-test1.cwzhlddlylx.us-east-1.rds.amazonaws.com -p 5432
-U myuser -d mydb sslrootcert=rds-ca-2015-root.pem sslmode=verify-full
Run Code Online (Sandbox Code Playgroud)

postgresql configuration aws ssl aurora

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

PostgreSQL选择具有动态日期范围的计数

首先,我是这个论坛的新手。我希望有人能就我的问题提供帮助或建议。

给定用户 createdAt 日期和当前日期。我想在这些日期之间以 10 个线性时间间隔检索用户的 Friends 记录总和。

因此,如果 createdAt 是 30 天前,那么我想要每隔 3 天间隔的用户好友总数。

用户表

??????????????????????????????????????????????
? id ? name     ? createdAt                  ?
??????????????????????????????????????????????
? 1  ? Timothee ? 2018-03-01 13:02:20.904+00 ?
??????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

朋友桌

???????????????????????????????????????????????????????
? id ? userId ? friendId ? createdAt                  ?
???????????????????????????????????????????????????????
? 1  ? 1      ? 234      ? 2018-03-20 15:41:51.779+00 ?
???????????????????????????????????????????????????????
? 2  ? 1      ? 254      ? 2018-03-20 16:16:34.698+00 ?
???????????????????????????????????????????????????????
? 3  ? 1      ? 288      ? 2018-03-15 15:17:39.907+00 ?
???????????????????????????????????????????????????????
? …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.6

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

重塑数据的技巧,类似于枢轴?

我有一个级别和年份表,大致如下所示:

INSERT INTO demo(first_name, rank, year) AS VALUES
  ('Peter',2,2017), ('Robert',3,2016), ('Evelyn',2,2017), 
  ('Rand',3,2017), ('Kofi',3,2017), ('Daniel',3,2016), ('Leonard',1,2017),
  ('Mary',1,2017), ('Frank',1,2017), ('John',3,2017), ('Mary',1,2016), 
  ('Gilbert',3,2016), ('Quince',2,2017), ('David',3,2017), ('Louis',2,2017),
  ('Felipe',2,2016), ('Alfonso',1,2017), ('Elise',3,2016), ('Jorge',3,2017),
  ('Mary',3,2016), ('Jasvant',2,2017), ('Paul',3,2017), ('Richard',2,2017),
  ('Christopher',2,2017), ('Johannes',2,2016), ('Nasser',3,2016), ('Bruce',3,2017), 
  ('John',3,2016), ('Frederic',3,2016);
Run Code Online (Sandbox Code Playgroud)

我可以用一个非常基本的方法捕获每个级别和年份的总数COUNT()

SELECT  rank, COUNT(*), year
FROM demo
GROUP BY rank, year
ORDER BY year, rank;
Run Code Online (Sandbox Code Playgroud)

这给了我一个相当整洁的演示数据摘要:

Rank  Count  Year
1      1    2016
2      2    2016
3      8    2016
1      4    2017
2      7    2017
3      7    2017
Run Code Online (Sandbox Code Playgroud)

我的实际数据要大得多,我希望能够在一个看起来更像这样的汇总表中看到它:

Rank    2016    2017 …
Run Code Online (Sandbox Code Playgroud)

postgresql pivot

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

Postgres 实体化视图的大小急剧增加

我有一个生产 postgres 10 数据库。每小时我都会在物化视图上运行“同时刷新物化视图”以重新计算值;每天只添加几个新行。

所有物化视图(及其索引)的大小都在急剧增加。应该是 102 MB 的视图现在是 1700 MB,并且指数也遭受了类似的通货膨胀。并且刷新时间从17秒增加到10分钟。由于视图及其索引的增长,整个数据库大小在最后一天从 4 GB 增长到 21 GB。我无法进行非并发刷新,因为这些视图不断被读取。

运行刷新会触发大量磁盘 I/O。

我不知道是什么导致了这个问题。我启用并配置了 autovacuum。我有 8GB 的​​内存,work_mem 设置为 256 MB。

postgresql materialized-view

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

SELECT COUNT(*) 返回错误结果

我在 RDS Aurora 上的 PostgreSQL 9.6.3 上看到了一些非常奇怪的行为。

我从某些查询中得到重复的结果:

=> select count(id) from foos where id = 'deadbeef';
 count 
-------
 2
(1 row)

=> select id from foos where id = 'deadbeef';
            id            
--------------------------
 deadbeef
 deadbeef
(2 rows)

=> select id, created_at from foos where id = 'deadbeef';
            id            |         created_at         
--------------------------+----------------------------
 deadbeef                 | 2018-01-01 10:00:00.000000
(1 row)
Run Code Online (Sandbox Code Playgroud)

(id 值、时间戳和表名已被混淆)

我在这张桌子或任何其他桌子上都没有桌子继承。

这似乎只影响恰好命中foos表上一个索引的查询。

因为这似乎与单个索引隔离,我想运行REINDEX 可能会解决这个问题。

但是,我不知道有多少索引表现出这种行为。

例如,这是通过不同索引对同一记录的类似行为:

=> select bar from foos where bar = 'qux';
                  bar                  
----------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

postgresql index unique-constraint aurora amazon-rds

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

从 N:M 关系中获取给定组的成员

我有这种 N:M 关系:

CREATE TABLE auth_user (
    id integer NOT NULL PRIMARY KEY,
    username character varying(150) NOT NULL UNIQUE
);

CREATE TABLE auth_group (
    id integer NOT NULL PRIMARY KEY,
    name character varying(80) NOT NULL UNIQUE
);

CREATE TABLE auth_user_groups (
    id integer NOT NULL PRIMARY KEY,
    user_id integer REFERENCES auth_user(id) NOT NULL,
    group_id integer REFERENCES auth_group(id) NOT NULL,
    CONSTRAINT user_groups UNIQUE(user_id, group_id)
);

INSERT INTO auth_user VALUES (1, 'user1');
INSERT INTO auth_user VALUES (2, 'user2');
INSERT INTO auth_group VALUES …
Run Code Online (Sandbox Code Playgroud)

postgresql join many-to-many

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