如果我在 PostgreSql 中声明一列serial,它将按顺序自动递增。由于回滚等原因,最终结果可能不连续,但或多或少是有序的。
我有一个用户表,其中用户 ID 设置为serial,因此从 1 开始递增...但我宁愿它们不是,因为这似乎要求某种序列号攻击。
是否有一种相对简单、相对高效的方法可以在 PostgreSQL 中创建自动人工 ID,使 ID 随机间隔开,并且您不应该期望 ID 987654321 位于 ID 987654320 后面?
当我尝试运行代码时出现此错误。

我在网站上搜索了这个问题
但它无法解决我的问题。
当我尝试使用我的用户名(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)
--我没有对这个文件做任何事情 --
有没有办法让我从子查询返回多个列,或者至少返回一个作为我需要的所有列的 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) 由于读者不会阻止编写者,编写者也不会阻止读者就是 MVCC 的全部内容,那么 postgresql 如何防止正在将更改提交到块/页面的编写者阻止读者读取这些不一致的数据呢?
因此,根据我对 PostgreSQL MVCC 的理解,每个表都表示为一个堆文件,每个堆文件包含页面/块的集合,这些页面/块是 8 kb 的信息段。
所以说两个事务T1并发T2运行并T1决定对block1. 因此,首先,在内存中T1读取并对其进行修改,当最终完成时,它决定提交;block1即实际上将这些内存中的更改写回block1. 所以我知道xmax它修改的先前条目被设置为id(T1),并且创建了一个新条目并xmin设置为id(T1)。现在我发现困难的是,当实际的提交过程发生时T1,比如说T2读取(而写入T1已经开始但尚未结束)。此案如何处理?
任何答案将不胜感激
我试图找出一个特殊的UNIQUE约束:表中有很多列Users,但只有这两列与问题相关:
id bigint,
active boolean,
...
Run Code Online (Sandbox Code Playgroud)
我想允许多行具有相同的id-但其中只有一行可能具有active = true.
例如,可以有很多行包含id = 1和active = false,但只有一行可以包含id = 1和active = true。
我是 PostgreSQL 的新手,所以如果我的问题听起来很愚蠢,请忽略。
想象一下,我们在 PostgreSQL 中有三个数据库,TRUNCATE一个小时前有人错误地在其中一个数据库上运行了一个命令。现在我们想单独为那个数据库做一个 PITR,因为只有一个数据库有问题。
在 PostgreSQL 中是否可以为一个特定的数据库执行 PITR 或者它只能在实例级别发生?
我阅读了持续存档和时间点恢复 (PITR)的文档。看起来它只能在实例级别完成(我猜我们在 PostgreSQL 世界中将实例称为“数据库集群”,我来自 SQL Server 世界)。
与普通文件系统备份技术一样,这种方法只能支持整个数据库集群的恢复,而不是一个子集。
如果 PITR 在 DB 级别是不可能的,那么 Prod DBA 如何处理这种情况?
还有最后一件事,我有一个带有多个数据库的测试服务器,如果 PITR 在数据库级别是可能的,那么请分享我的步骤,以便我可以自己测试它。
我主要对支持的 Postgres 版本感兴趣。我的测试服务器是 PostgreSQL 9.6.16。
我看过很多文章和视频,它们都对 MySQL 上的 Postgres 进行了如下描述。
Postgres 在为每个连接分叉一个新进程时会分配大量内存(大约 10MB)。这会导致内存使用量膨胀并有效地消耗速度。因此,它牺牲了数据完整性和标准合规性的速度。对于简单的实现,Postgres 将是一个糟糕的选择!- 相扑逻辑
每次我在某处读到或听到它时,都没有关于它真正意味着什么或是否有办法处理它的上下文。在 PostgreSQL 中处理这类问题的具体方法是什么?这是通过使用连接池来克服的吗?
我开发了一个在 Postgresql 中实现事务的库,在我的工作中,我们在生产中遇到了一个奇怪的错误,当事务失败不是查询本身,而是COMMIT由于触发器中的某些内容失败。显然,我的图书馆没有以正确的方式处理这种情况。
显然,我想在我的库测试套装中复制这个错误,但我不想引入所有复杂的设置。我需要的所有行为是,Postgresql 必须不向事务内的任何查询返回错误,而是在您尝试时返回错误COMMIT。实现它的最小和稳定的方法是什么?
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+ …