标签: postgresql

从表中查找“n”个连续的空闲数字

我有一些这样的数字表(状态是免费的或分配的)

id_set 号码状态         
-----------------------
1 000001 已分配
1 000002 免费
1 000003 已分配
1 000004 免费
1 000005 免费
1 000006 已分配
1 000007 已分配
1 000008 免费
1 000009 免费
1 000010 免费
1 000011 已分配
1 000012 已分配
1 000013 已分配
1 000014 免费
1 000015 已分配

我需要找到“n”个连续数字,因此对于 n = 3,查询将返回

1 000008 免费
1 000009 免费
1 000010 免费

它应该只返回每个 id_set 的第一个可能的组(实际上,它只会为每个查询的 id_set 执行)

我正在检查 WINDOW 函数,尝试了一些类似的查询COUNT(id_number) OVER (PARTITION BY id_set ROWS UNBOUNDED PRECEDING),但这就是我得到的:) 我想不出逻辑,如何在 …

postgresql window-functions group-by gaps-and-islands

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

PostgreSQL:无法将目录更改为 /root

我正在尝试将表planet_osm_polygon从一个数据库复制osm到另一个数据库test。我su postgres并执行了pg_dump.

问题:但是我收到错误could not change directory to "/root"并且Password:提示出现了两次!有没有办法pg_dump在登录时执行root

root@lalaland:~# su postgres
postgres@lalaland:/root$ pg_dump -h localhost "osm" --table "public.planet_osm_polygon" | 
    psql -h localhost "test" --table "staging.planet_osm_polygon"
could not change directory to "/root"
could not change directory to "/root"
Password: Password:
Run Code Online (Sandbox Code Playgroud)

更新

问题#2:public即使我通过了 flag ,表似乎也被复制到了模式中--table="staging.planet_osm_polygon"。为什么不将其复制到 schema staging

postgresql postgis postgresql-9.1

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

使用 HAProxy 和 PGBouncer 的 PostgreSQL 高可用性/可扩展性

我有多个用于 Web 应用程序的 PostgreSQL 服务器。通常在热备模式(异步流复制)下一个主多从。

我使用 PGBouncer 进行连接池:安装在每个 PG 服务器(端口 6432)上的一个实例连接到本地主机上的数据库。我使用事务池模式。

为了在从站上平衡我的只读连接,我使用 HAProxy (v1.5) 和 conf 或多或少像这样:

listen pgsql_pool 0.0.0.0:10001
        mode tcp
        option pgsql-check user ha
        balance roundrobin
        server master 10.0.0.1:6432 check backup
        server slave1 10.0.0.2:6432 check
        server slave2 10.0.0.3:6432 check
        server slave3 10.0.0.4:6432 check
Run Code Online (Sandbox Code Playgroud)

因此,我的 Web 应用程序连接到 haproxy(端口 10001),即在每个 PG 从站上配置的多个 pgbouncer 上的负载平衡连接。

这是我当前架构的表示图:

haproxy > pgbouncer > postgresql

这很有效,但我意识到有些人的实现方式完全不同:Web 应用程序连接到单个 PGBouncer 实例,该实例连接到 HAproxy,它在多个 PG 服务器上进行负载平衡:

pgbouncer > haproxy > postgresql

最好的方法是什么?第一个(我现在的)还是第二个?一种解决方案相对于另一种解决方案有什么优势吗?

谢谢

postgresql scalability high-availability pgbouncer load-balancing

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

如何在PostgreSQL(或一般的SQL)中实现业务逻辑权限?

假设我有一个项目表:

CREATE TABLE items
(
    item serial PRIMARY KEY,
    ...
);
Run Code Online (Sandbox Code Playgroud)

现在,我想为每个项目介绍“权限”的概念(请注意,我在这里不是在谈论数据库访问权限,而是该项目的业务逻辑权限)。每个项目都具有默认权限以及可以覆盖默认权限的每用户权限。

我试图想出几种方法来实现这一点,并提出了以下解决方案,但我不确定哪个是最好的以及为什么:

1) 布尔解决方案

为每个权限使用布尔列:

CREATE TABLE items
(
    item serial PRIMARY KEY,

    can_change_description boolean NOT NULL,
    can_change_price boolean NOT NULL,
    can_delete_item_from_store boolean NOT NULL,
    ...
);

CREATE TABLE item_per_user_permissions
(
    item int NOT NULL REFERENCES items(item),
    user int NOT NULL REFERENCES users(user),

    PRIMARY KEY(item, user),

    can_change_description boolean NOT NULL,
    can_change_price boolean NOT NULL,
    can_delete_item_from_store boolean NOT NULL,
    ...
);
Run Code Online (Sandbox Code Playgroud)

优点:每个权限都是命名的。

缺点:有几十个权限会显着增加列数,并且您必须定义它们两次(每个表中一次)。

2)整数解

使用整数并将其视为位域(即位 0 …

postgresql enum

19
推荐指数
2
解决办法
7438
查看次数

如何将ctid分解为页码和行号?

表中的每一行都有一个系统列 ctid,其类型tid表示该行的物理位置:

create table t(id serial);
insert into t default values;
insert into t default values;
Run Code Online (Sandbox Code Playgroud)
select ctid
     , id
from t;
Run Code Online (Sandbox Code Playgroud)
ctid | ID
:---- | -:
(0,1) | 1
(0,2) | 2

dbfiddle在这里

ctid最合适的类型(例如integerbigintnumeric(1000,0))中获取页码的最佳方法是什么?

我能想到的唯一的办法是非常难看。

postgresql data-pages datatypes cast postgresql-9.4

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

什么是最有效的 UUID 列类型

为了存储 128 位 UUID,有多种存储选项:

  1. 一个字节[16]列
  2. 两个 bigint/long(64 位)列
  3. CHAR(36) 列 - 32 个十六进制数字 + 4 个破折号。
  4. 一个 UUID 数据库特定列,如果 db 支持它

从索引的角度来看,哪些是最有效的?如果数据库不支持专用的 uuid 类型,那么 1、2、3 中的哪一个是最佳选择?

mysql postgresql index oracle sql-server

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

postgres 中的快速汉明距离查询

我有一个包含图像感知哈希的大型数据库(1600 万行)。

我希望能够在合理的时间范围内通过汉明距离搜索行。

目前,就我正确理解这个问题而言,我认为这里最好的选择是实现BK-Tree的自定义 SP-GiST 实现,但这似乎需要做很多工作,而且我对实际操作仍然很模糊正确实施自定义索引的详细信息。计算汉明距离很容易处理,不过我确实知道 C。

基本上,这里合适的方法是什么?我需要能够在哈希的特定编辑距离内查询匹配项。据我了解,等长字符串的 Levenshtein 距离在功能上是汉明距离,所以至少有一些现有的支持我想要的东西,虽然没有明确的方法从中创建索引(请记住,我正在查询的值变化。我无法预先计算与固定值的距离,因为那只会对那个值有用)。

散列当前存储为包含散列的二进制 ASCII 编码的 64 字符字符串(例如“10010101...”),但我可以很容易地将它们转换为 int64。真正的问题是我需要能够相对快速地进行查询。

看起来这可能是可能实现沿着什么,我想用线的东西pg_trgm,但我对如何卦匹配mechamism作品有点不清楚(特别是,什么是相似性量度它返回实际上代表什么?它看起来有点像编辑距离)。

插入性能并不重要(计算每一行的哈希值在计算上非常昂贵),所以我主要关心搜索。

postgresql index postgresql-9.3

19
推荐指数
2
解决办法
6745
查看次数

如何使 pg_dump 跳过扩展?

这是在 9.3 上,但我记得自 7.x 以来发生过类似的事情。所以我创建了数据库并在其中安装了 plpgsql 扩展。后来我创建了一个 pg_dump,在将它恢复到数据库之前,我确保它也有 plpgsql 扩展名。然后在恢复时会发生这种情况:

pg_restore: creating EXTENSION plpgsql
pg_restore: creating COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2053; 0 0 COMMENT EXTENSION plpgsql
pg_restore: [archiver (db)] could not execute query: ERROR:  must be owner of extension plpgsql
Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
Run Code Online (Sandbox Code Playgroud)

我正在创建一堆脚本,pg_restore 返回 0 对我来说非常重要,所以我可以忽略这一点这一事实没有任何好处。让我感到困惑的是 IIRC 我需要以 postgres 主用户的身份创建扩展,所以我不知道为什么所有这些扩展的东西最终都在我的转储中。毕竟,我不是语言/扩展的所有者?

无论如何,对于如何摆脱这种情况的任何建议,我将不胜感激。请注意,我知道 -l/-L 开关是如何工作的。然而,仅仅纠正一个简单的扩展注释似乎需要付出太多努力。

postgresql postgresql-9.3 pg-dump

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

对数据库中的所有模式授予使用权?

我想要GRANT USAGE一个给定数据库的用户/角色。数据库有许多模式。

我知道有一个ON ALL TABLES IN SCHEMA,但我想要“所有模式”。我试过了GRANT USAGE .. ON DATABASE,但这显然是错误的(它实际上并不存在)。

这是针对 Postgres 9.3 或 9.4,它恰好是 AWS RDS 上的服务器。

postgresql postgresql-9.3 amazon-rds

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

我是否应该将我的 UUID 主键列称为 ID?

我正在研究一种广泛使用UUIDs for PRIMARY KEYs 的数据库设计。然而,这让我面临一个非常重要的选择。我如何命名这些列?我会称它们uuid为 ,但UUID作为标识符,我必须在各处引用字段名称:

CREATE TABLE thingie (
  "uuid" UUID PRIMARY KEY DEFAULT public.gen_random.uuid(),
  foo VARCHAR,
  bar VARCHAR,
);
Run Code Online (Sandbox Code Playgroud)

一个直接的替代方案似乎是调用这些列id

CREATE TABLE thingie (
  id UUID PRIMARY KEY DEFAULT public.gen_random.uuid(),
  foo VARCHAR,
  bar VARCHAR,
);

Run Code Online (Sandbox Code Playgroud)

这样,我就没有列名,并且从语义上讲,我可以说 UUID 确实是一种 ID;在维恩图中,UUID 圆将完全放置在 ID 圆中。

然而,我(并且我相信许多其他人)已经习惯于id与自动递增INTEGER列关联,以至于我担心通过调用这些 ID 来打破某种不成文的规则id

如果您能通过一些可靠的自行车脱落来消除我的困惑,我将非常感激。事实上,我的问题是:会如何称呼你的-typed 代理键,为什么?UUID

postgresql naming-convention uuid

19
推荐指数
2
解决办法
8810
查看次数