标签: postgresql

选择孤立行(以通用方式)

我有一个表my_tables,它在几个表中被引用为外键。

我想选择my_table其他表中未引用的所有行。

AFAIK,应该可以以通用方式(带有一些内省魔法)来做到这一点。

postgresql foreign-key metadata postgresql-10

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

PostgreSQL:如何获得值的总和以及进入每个值的总行数?

我有一张表格,MyData格式如下:

|id|theme_id|priority_id|value|
Run Code Online (Sandbox Code Playgroud)

我正在尝试为所有行获得以下结果:

theme_id | priority_id | total | sum
------------------------------------
    1    |      1      |   3   |  5
    1    |      2      |   5   |  12
    1    |      3      |   1   |  3
    2    |      1      |   2   |  6
Run Code Online (Sandbox Code Playgroud)

我们的想法是组中的所有行通过theme_idpriority_id再总结的数值为分组,以及,以获取进入那笔总行。

当我尝试以下操作时,我得到一个与 sum 列相等的 total 列:

|id|theme_id|priority_id|value|
Run Code Online (Sandbox Code Playgroud)

我也试过:

SELECT theme_id, priority_id, sum(value) AS values, count(id) as total
FROM MyData
GROUP BY theme_id, priority_id
Run Code Online (Sandbox Code Playgroud)

以上两个都给了我相同的输出:

theme_id | priority_id | total | sum
------------------------------------
    1    |      1 …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate

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

将总和列添加到 PostgreSQL 9.0 中的 crosstab() 查询

继我之前的问题之后:

在 PostgreSQL 9.0 中创建 crosstab() 数据透视表

我设法创建了一个数据透视表来ageband使用该crosstab()函数。我可以使用它来创建基本无几何表的视图或表。

但是,这仍然没有多大用处,因为我需要将其链接到gazetteers_and_addresses.unit_postcode表格以分配几何图形以进行进一步分析。

我将附上两个表的表结构和用于创建交叉表的原始代码。

CREATE OR REPLACE VIEW adult_social_care.vw_ageband AS (
    SELECT * FROM crosstab(
        'SELECT postcode_nospace_, ageband, count(ageband) as total_count
         FROM adult_social_care.activities_in_localities_asc
         GROUP BY postcode_nospace_, ageband
         ORDER BY postcode_nospace_'

         ,$$VALUES ('18-24'::text), ('25-34'), ('35-44'), ('45-54'), ('55-64'), ('65-74'), ('75-84'), ('85-94'), ('95 AND OVER')$$)
    AS ct("postcode" text, "18-24" numeric, "25-34" numeric,"35-44" numeric, "45-54" numeric, "55-64" numeric, "65-74" numeric, "75-84" numeric, "85-94" numeric, "95 AND OVER" numeric));
Run Code Online (Sandbox Code Playgroud)

表定义:

activities_in_localities_asc

CREATE …
Run Code Online (Sandbox Code Playgroud)

postgresql datatypes cte pivot postgresql-9.0

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

无法使用 PostgreSQL COPY 从 /tmp 读取,但能够以完全相同的权限从另一个目录读取相同的文件

我有一个/tmp/foo.csv看起来像这样的文件:

1,2
10,20
100,200
Run Code Online (Sandbox Code Playgroud)

我在另一个目录中有相同的文件/mydata/foo.csv。目录文件都具有完全相同的权限、所有者,并且是由同一个用户创建的,但是当我运行时

COPY foo FROM '/tmp/foo.csv' (FORMAT CSV, DELIMITER ',', HEADER TRUE);
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

ERROR:  could not open file "/tmp/foo.csv" for reading: No such file or directory
Run Code Online (Sandbox Code Playgroud)

当我跑

COPY foo FROM '/mydata/foo.csv' (FORMAT CSV, DELIMITER ',', HEADER TRUE);
Run Code Online (Sandbox Code Playgroud)

我明白了COPY 3

我在这里缺少什么?

以下是相关文件和目录信息:

??foo@bar  / ‹py27› 
??$ ll -d /mydata /mydata/foo.csv /tmp /tmp/foo.csv                                                                                                                       1 ?
drwxrwxrwt  2 root root 4.0K Sep  9 08:26  /mydata
drwxrwxrwt 17 root root  420 …
Run Code Online (Sandbox Code Playgroud)

postgresql linux postgresql-9.4

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

如何在函数中按顺序对表列表运行 ALTER TABLE

我有一个模式(称为import),其中数据作为表导入,以及一个处理它们的函数。之后我想将这些表移到另一个模式中(称为data_archive)中。现有功能运行良好,但我找不到更改架构的方法;这是我编写的一个函数:

我的想法是根据selecta 为该管理制作的表格提供的标准创建表格列表,然后遍历此列表并执行以下操作Alter table xxxx SET schema data_archive

CREATE OR REPLACE FUNCTION archive_datasets()
  RETURNS VOID AS
$BODY$
DECLARE
   table_rec  record;

BEGIN

   FOR table_rec IN
      SELECT t.table_name
      FROM information_schema.tables AS t
      WHERE table_schema = 'import'
      AND quote_ident(t.table_name) IN (
              SELECT "table_name"
              FROM data_sets 
              WHERE status IN ('Processed', 'Archived', 'Deleted')
              ) 

   LOOP
     ALTER TABLE quote_ident(table_rec.table_name) SET schema data_archived;
   END LOOP;

END;
$BODY$
  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

但我收到此错误消息:

ERROR:  syntax error at or near "("
LINE 28: …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql alter-table plpgsql functions

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

尽管在列上排序了索引,但为什么查询计划仍然对表进行排序?

我正在使用 Postgres 9.1 我要加入两个表:

wikidb=> \d page
                         Table "public.page"
        Column         |     Type      |          Modifiers           
-----------------------+---------------+------------------------------
 page_id               | bigint        | not null
 page_namespace        | integer       | not null default 0
 page_title            | text          | not null default ''::text
 [...]
Indexes:
    [...]
    "page_page_namespace_page_title_idx" UNIQUE, btree (page_namespace, page_title)

wikidb=> \d pagelinks
                 Table "public.pagelinks"
      Column       |  Type   |         Modifiers          
-------------------+---------+----------------------------
 pl_from           | bigint  | not null default 0::bigint
 pl_namespace      | integer | not null default 0
 pl_title          | text    | not null default ''::text …
Run Code Online (Sandbox Code Playgroud)

postgresql performance optimization execution-plan postgresql-9.1 query-performance

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

从 pg_class.reltuples 获取给定条件下的计数估计值

是否可以reltuples使用附加条件查询给定表的列table.name LIKE 'hello%'

目前在我更大的表上,SELECT count(*)查询需要很长时间,我不需要确切的计数。所以我想知道是否可以WHERE在 the 中添加子句reltuples

postgresql index count

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

在递归 CTE 中计算父级的子级

我使用此查询来查找父母的评论id

WITH RECURSIVE cte (id, content, path, parent_id, depth)  AS (
    SELECT  id,
        content,
        array[id] AS path,
        parent_id,
        1 AS depth
    FROM    comment
    WHERE   id = 1

    UNION ALL

    SELECT  comment.id,
        comment.content,
        cte.path || comment.id,
        comment.parent_id,
        cte.depth + 1 AS depth
    FROM    comment
    JOIN cte ON comment.parent_id = cte.id
    WHERE depth < 3
    )
    SELECT id, content, path, parent_id, depth FROM cte
ORDER BY path LIMIT 200;
Run Code Online (Sandbox Code Playgroud)

除了我将深度限制为 3 之外,它运行良好。我怎样才能知道当前行是否有更多的孩子,如果有,请获取它们的数量,以便我可以显示数字,例如。“多加载 X”。

解决这个问题的最佳方法是什么?

这个小提琴中id4 和 …

postgresql cte recursive

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

如何在不在 postgres 中创建大量索引的情况下进行唯一检查

我需要对 INSERT 和 UPDATE 操作实施唯一检查,但我更愿意避免在我的表上创建大量唯一索引(现在约为 12Gb)。现在我有唯一的部分索引并且它工作得很好,除了一件事 - 它需要大量的 SSD 空间。我不需要使用这个索引的 SELECT 操作,我只需要检查数据的唯一性。

我阅读了这个这个讨论,我明白唯一约束和唯一索引之间没有真正的区别,除了部分条件,它只能用于索引。

有没有办法做到这一点?

更新:

我的例子是带有历史选项的多对多关系表的模式。此选项由 2 个附加字段time_fromtime_to. 他们正在存储进入和离开关系的时间。为了数据一致性,我创建了 4 个额外的部分唯一索引(见下文)。

现在该表包含 1 162 010 000 行。以及每个索引的表的整体空间:

vkontakte_wall_post_likes_users - 57 GB
vkontakte_wall_post_like_users_post_id - 24 GB
vkontakte_wall_post_like_users_time_to_2col_uniq - 24 GB
vkontakte_wall_post_like_users_pkey - 24 GB
vkontakte_wall_post_like_users_user_id - 24 GB
vkontakte_wall_post_like_users_time_to_3col_uniq - 846 MB
vkontakte_wall_post_like_users_time_from_2col_uniq - 8192 bytes
vkontakte_wall_post_like_users_id_seq - 8192 bytes
Run Code Online (Sandbox Code Playgroud)

架构:

CREATE TABLE vkontakte_wall_post_likes_users
(
  id integer NOT NULL DEFAULT nextval('vkontakte_wall_post_like_users_id_seq'::regclass),
  post_id integer …
Run Code Online (Sandbox Code Playgroud)

postgresql index-tuning many-to-many

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

什么是“不可移动的行版本”?

我对 postgresql-9.4 数据库进行了完全真空,并且我有很多具有不可移动行版本的表。我想知道这些是什么或者我可以在哪里阅读它们。

INFO:  vacuuming "public.profile_generals"
INFO:  "profile_generals": found 0 removable, 654 nonremovable row versions in 51 pages
DETAIL:  0 dead row versions cannot be removed yet.
Run Code Online (Sandbox Code Playgroud)

postgresql vacuum

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