标签: postgresql

在 PostgreSQL 中创建一个非序数数字 ID

如果我在 PostgreSql 中声明一列serial,它将按顺序自动递增。由于回滚等原因,最终结果可能不连续,但或多或​​少是有序的。

我有一个用户表,其中用户 ID 设置为serial,因此从 1 开始递增...但我宁愿它们不是,因为这似乎要求某种序列号攻击。

是否有一种相对简单、相对高效的方法可以在 PostgreSQL 中创建自动人工 ID,使 ID 随机间隔开,并且您不应该期望 ID 987654321 位于 ID 987654320 后面?

postgresql primary-key uniqueidentifier

0
推荐指数
1
解决办法
2538
查看次数

PostgreSQL 错误:OperationalError: FATAL: 角色“用户名”不存在

当我尝试运行代码时出现此错误。

错误

我在网站上搜索了这个问题

但它无法解决我的问题。

当我尝试使用我的用户名(TCOYUKSEL)创建超级用户时,它会使用“tcoyuksel”创建另一个超级用户

错误

ozgur.py 第 9 行 db = psycopg2.connect("dbname=news")

ozgur.py 第 73 行get_pop_articles(), str("views"))

init .py 第 130 行 conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
--我没有对这个文件做任何事情 --

postgresql

0
推荐指数
1
解决办法
7433
查看次数

如何截断表并将 id 设置为默认值 1?

截断表并插入任何数据后,但在表中,表 id 不以 1 开头

截断表源;

postgresql

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

返回多列或 JSON 对象的子查询

有没有办法让我从子查询返回多个列,或者至少返回一个作为我需要的所有列的 JSON 对象的列?

这是一个有效的查询:

select r.*,
       (select status
        from builds
        where repo = r.id
          and branch = 'master'
        order by id desc
        limit 1)
from repos r
where id = any($1)
Run Code Online (Sandbox Code Playgroud)

在哪里$1id 数组在

但我想返回的不仅仅是表中的状态列builds

select r.*,
       (select status, start_time, end_time
        from builds
        where repo = r.id
          and branch = 'master'
        order by id desc
        limit 1)
from repos r
where id = any($1)
Run Code Online (Sandbox Code Playgroud)

环顾四周后,似乎这row_to_json应该对我有用。但是,我不确定在这种情况下它应该如何工作:

select r.*,
       row_to_json(select status,
                   start_time, end_time
                   from builds
                   where repo …
Run Code Online (Sandbox Code Playgroud)

postgresql

0
推荐指数
1
解决办法
4409
查看次数

编写者如何不阻止 PostgreSql 中的读取

由于读者不会阻止编写者,编写者也不会阻止读者就是 MVCC 的全部内容,那么 postgresql 如何防止正在将更改提交到块/页面的编写者阻止读者读取这些不一致的数据呢?

因此,根据我对 PostgreSQL MVCC 的理解,每个表都表示为一个堆文件,每个堆文件包含页面/块的集合,这些页面/块是 8 kb 的信息段。

所以说两个事务T1并发T2运行并T1决定对block1. 因此,首先,在内存中T1读取并对其进行修改,当最终完成时,它决定提交;block1即实际上将这些内存中的更改写回block1. 所以我知道xmax它修改的先前条目被设置为id(T1),并且创建了一个新条目并xmin设置为id(T1)。现在我发现困难的是,当实际的提交过程发生时T1,比如说T2读取(而写入T1已经开始但尚未结束)。此案如何处理?

任何答案将不胜感激

postgresql transaction acid snapshot-isolation mvcc

0
推荐指数
1
解决办法
2323
查看次数

对特定配对的唯一约束

我试图找出一个特殊的UNIQUE约束:表中有很多列Users,但只有这两列与问题相关:

id bigint,
active boolean,
...
Run Code Online (Sandbox Code Playgroud)

我想允许多行具有相同的id-其中只有一行可能具有active = true.

例如,可以有很多行包含id = 1active = false,但只有一行可以包含id = 1active = true

postgresql database-design unique-constraint

0
推荐指数
1
解决办法
999
查看次数

我们可以做一个特定 PostgreSQL 数据库的 PITR 吗

我是 PostgreSQL 的新手,所以如果我的问题听起来很愚蠢,请忽略。

想象一下,我们在 PostgreSQL 中有三个数据库,TRUNCATE一个小时前有人错误地在其中一个数据库上运行了一个命令。现在我们想单独为那个数据库做一个 PITR,因为只有一个数据库有问题。

在 PostgreSQL 中是否可以为一个特定的数据库执行 PITR 或者它只能在实例级别发生?

我阅读了持续存档和时间点恢复 (PITR)的文档。看起来它只能在实例级别完成(我猜我们在 PostgreSQL 世界中将实例称为“数据库集群”,我来自 SQL Server 世界)。

与普通文件系统备份技术一样,这种方法只能支持整个数据库集群的恢复,而不是一个子集。

如果 PITR 在 DB 级别是不可能的,那么 Prod DBA 如何处理这种情况?

还有最后一件事,我有一个带有多个数据库的测试服务器,如果 PITR 在数据库级别是可能的,那么请分享我的步骤,以便我可以自己测试它。

我主要对支持的 Postgres 版本感兴趣。我的测试服务器是 PostgreSQL 9.6.16。

postgresql restore

0
推荐指数
1
解决办法
52
查看次数

处理 Postgres 在 fork 新进程时分配大量内存的问题的有效方法是什么?

我看过很多文章和视频,它们都对 MySQL 上的 Postgres 进行了如下描述。

Postgres 在为每个连接分叉一个新进程时会分配大量内存(大约 10MB)。这会导致内存使用量膨胀并有效地消耗速度。因此,它牺牲了数据完整性和标准合规性的速度。对于简单的实现,Postgres 将是一个糟糕的选择!- 相扑逻辑

每次我在某处读到或听到它时,都没有关于它真正意味着什么或是否有办法处理它的上下文。在 PostgreSQL 中处理这类问题的具体方法是什么?这是通过使用连接池来克服的吗?

postgresql postgresql-performance

0
推荐指数
1
解决办法
29
查看次数

如何在事务提交时触发错误?

我开发了一个在 Postgresql 中实现事务的库,在我的工作中,我们在生产中遇到了一个奇怪的错误,当事务失败不是查询本身,而是COMMIT由于触发器中的某些内容失败。显然,我的图书馆没有以正确的方式处理这种情况。

显然,我想在我的库测试套装中复制这个错误,但我不想引入所有复杂的设置。我需要的所有行为是,Postgresql 必须不向事务内的任何查询返回错误,而是在您尝试时返回错误COMMIT。实现它的最小和稳定的方法是什么?

postgresql transaction

0
推荐指数
1
解决办法
30
查看次数

数十万行的触发器 updatedAt=NOW() 将不实际

updatedAt如果在 PG 9.6 中插入/更新了新数据,我将使用 SQL 触发器来更新列。

这是触发器将调用的函数

CREATE FUNCTION sp_updatedatstamp() RETURNS trigger AS $updatedat_stamp$
  BEGIN
    NEW."updatedAt" := now();
    RETURN NEW;
  END;
$updatedat_stamp$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

这是触发脚本

create trigger tg_de_installment_cdcupdatedat before
insert or update
    on
    public.table for each row execute procedure sp_updatedatstamp()
Run Code Online (Sandbox Code Playgroud)

这是表定义

CREATE TABLE table (
    id serial NOT NULL,
    "type" text NULL,
    "transactionDate" timestamptz NULL,
    remark text NULL,
    "createdAt" timestamptz NULL,
    "updatedAt" timestamptz NULL,
    "deletedAt" timestamptz NULL,
    CONSTRAINT table_pkey PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)

此代码适用于小数据,直到应用程序执行需要 30 分钟的批量更新查询(将更新 100K+ …

postgresql trigger

0
推荐指数
1
解决办法
25
查看次数