标签: postgresql

错误:无法打开扩展控制文件“/usr/share/postgresql/13/extension/postgis.control”:没有这样的文件或目录

Ubuntu 21.10、PostgreSQL 13。

在此输入图像描述

我发现错误

ERROR: could not open extension control file "/usr/share/postgresql/13/extension/postgis.control": No such file or directory
Run Code Online (Sandbox Code Playgroud)

如何修复它?

postgresql ubuntu postgis

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

索引不用于日期范围条件

我是这样查询的:

SELECT count(*)
FROM orders
WHERE planned_shipping_date >= '2022-04-04'
AND planned_shipping_date < '2022-04-05'
Run Code Online (Sandbox Code Playgroud)

然后我遇到了这个答案,因为在更复杂的查询中它使查询更容易阅读,所以我重写了查询,如下所示:

SELECT count(*)
FROM orders
WHERE planned_shipping_date <@ daterange('2022-04-04', '2022-04-05')
Run Code Online (Sandbox Code Playgroud)

我相信它们在语义上是相同的,但看看计划:

Aggregate  (cost=76.91..76.92 rows=1 width=8) (actual time=1.066..1.068 rows=1 loops=1)
  ->  Index Only Scan using orders_planned_shipping_date_idx on orders  (cost=0.29..69.73 rows=2872 width=0) (actual time=0.067..0.646 rows=2813 loops=1)
        Index Cond: ((planned_shipping_date >= '2022-04-04'::date) AND (planned_shipping_date < '2022-04-05'::date))
        Heap Fetches: 0
Run Code Online (Sandbox Code Playgroud)
Aggregate  (cost=2753.57..2753.58 rows=1 width=8) (actual time=18.309..18.311 rows=1 loops=1)
  ->  Index Only Scan using orders_planned_shipping_date_idx on orders  (cost=0.29..2751.93 rows=655 width=0) …
Run Code Online (Sandbox Code Playgroud)

postgresql index range-types

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

到底什么时候检查 IMMEDIATE 约束以及 Postgres 中的“语句”到底是什么?

我目前对立即约束检查的确切时间感到困惑。希望下面的例子能解决我的困惑:

create table a (
  id int primary key
);

create table b (
  id int primary key,
  a_id int not null references a
);

/* violates foreign key constraint "b_a_id_fkey" */
with t1 as (insert into b values (100, 200) returning id, a_id)
  select * from t1;

/* ERROR: expensive_exception_thrower */
with t1 as (insert into b values (100, 200) returning id, a_id)
  select * from t1 where expensive_exception_thrower(t1.a_id) = true;
Run Code Online (Sandbox Code Playgroud)

在第二个查询中,尽管引用了 t1,但expensive_exception_thrower仍会首先抛出其异常,这会导致 fkey 异常被吞没。当然,有解决方法,但是当 Postgres …

postgresql constraint

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

是否有可能在 PostgreSQL 中永远不运行 Vacuum Full

由于aVACUUM FULL锁表,这对于我们的生产环境来说是不可接受的。

是否可以只在生产系统上运行VACUUM而不运行?VACUUM FULL

是否可以VACUUM让空间重新用于新的INSERT用途?

postgresql locking vacuum

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

如何将当前行传递给 Postgres 中的生成列函数?

Postgres 12+ 支持生成列:https://www.postgresql.org/docs/current/ddl- generated-columns.html

从文档来看,语法似乎受到限制 - 它强制人们显式命名生成列所依赖的列。

CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);
Run Code Online (Sandbox Code Playgroud)

有没有办法将整行传递给生成函数?就像是

CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS generator_function(current_row) STORED
);
Run Code Online (Sandbox Code Playgroud)

postgresql functions computed-column postgresql-12

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

查询中不使用表达式索引(正则表达式模式匹配)

在我的PostgreSQL 12.8数据库中,我有一个相对简单的表the_table,其中有一列value类型为varchar

CREATE TABLE public.the_table (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    label character varying,
    value character varying,
    created_at timestamp without time zone NOT NULL,
    updated_at timestamp without time zone NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)

我想查询具有格式为电子邮件地址的值的所有行。查询看起来像这样:SELECT * FROM the_table WHERE value ~ '^[a-zA-Z0-9.$%&*+/=?^_{|}~-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9]+$'

由于该表中有几百万行,我尝试通过添加匹配的表达式索引来加速此查询CREATE INDEX index_the_table_on_email_values ON the_table ((value ~ '^[a-zA-Z0-9.$%&*+/=?^_{|}~-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9]+$'));

不幸的是,查询计划程序不使用索引,而是对表执行完整扫描,这非常慢。

有人可以帮我修复索引或告诉我还有什么其他选择吗?我已经考虑过生成布尔列is_email。我可以向生成的列添加索引并直接查询它。但这对于原始问题来说似乎是一个奇怪的解决方法,应该可以通过匹配的索引来解决,对吗?

postgresql index regex

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

Postgres:使用条件创建唯一索引

我在 Postgres 中有一个表,其中记录类型为[event_id, user_id, status]。用户的范围是每个事件的,因此我有一个唯一的索引,[event_id, user_id]以便用户具有唯一的状态。状态是枚举类型。

但是,我最多只能拥有一条 status=owner 的记录。我正在尝试放置一个条件索引,例如[event_id, status] where "status" == "owner".

[ev, user, status]
[1,  1,    owner]   <- ok
[1,  2,    owner]   <- wrong
[1,  2,    pending] <- ok
[1,  3,    pending] <- ok
Run Code Online (Sandbox Code Playgroud)

有任何线索如何做到这一点吗?

postgresql index

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

两个不同表上的并发更新失败

我使用 PostgreSQL 和以下数据库架构:

CREATE TABLE plans (
    slug VARCHAR(500) PRIMARY KEY
);

CREATE TABLE users (
    id VARCHAR(16) PRIMARY KEY,
    org_id VARCHAR(16) NOT NULL
);

CREATE TABLE orgs (
    id VARCHAR(16) PRIMARY KEY,
    plan_slug VARCHAR(500) NOT NULL,
    last_write_at DOUBLE PRECISION
);
Run Code Online (Sandbox Code Playgroud)

就我而言,我想编写一个查询来更新某些组织plan_slug并保护它免受其他可能的并发更新的影响。为此,我SELECT在子查询中使用 a 并按FOR UPDATE特定顺序锁定行以避免死锁。就像下面的查询一样:

UPDATE orgs
SET plan_slug = 'plan_1'
WHERE id = ANY(
    SELECT subquery_orgs.id
    FROM orgs AS subquery_orgs
    JOIN users ON users.org_id = subquery_orgs.id
    WHERE users.id = ANY('{user_1, user_2, user_3}')
    ORDER …
Run Code Online (Sandbox Code Playgroud)

postgresql deadlock subquery update where

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

如何在 psql 中获取 Postgresql 错误号?

如何访问 中错误的数字代码psql

例如,在本例中,我想获取值 23503(“foreign_key_violation”),如下所示: https: //www.postgresql.org/docs/current/errcodes-appendix.html

postgres=# insert into t values('bb');
ERROR:  insert or update on table "t" violates foreign key constraint "fd"

-- How can I see the numeric error code here?
Run Code Online (Sandbox Code Playgroud)

postgresql psql errors

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

对于什么类型的数据最好使用关系数据库,对于什么类型的数据最好使用非关系数据库?

我正在尝试编写我的第一个大型后端项目。这是一个类似于 Instagram 的移动/网络应用程序,但用途不同。当我在互联网上搜索时,我发现 Instagram 使用 PostgreSQL 和 Cassandra 作为它的主要数据库。但我不知道它使用哪个数据库的目的/类型/部分数据?

有谁了解更多有关 Instagram 使用的数据库的信息,或者一般情况下,我可以知道如何决定哪些服务或哪种类型的数据/应用程序最好使用 SQL 或 NoSQL 数据库吗?

postgresql database-design application-design cassandra design-pattern

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