gpt4 book ai didi

postgresql - 插入记录违反了 PostgreSQL 中的两个唯一索引。先检查哪个?

转载 作者:行者123 更新时间:2023-11-29 12:07:23 25 4
gpt4 key购买 nike

我有一个 PostgreSQL 表,在不同字段(nicknameemail)上有两个唯一索引。我正在尝试插入违反这两个约束的记录。我希望首先检查并报告 nickname

我观察到首先创建的索引首先被检查,所以我首先在 nickname 上创建索引并且它有点工作。但这种行为是否已指定并且我可以依赖它,还是只是偶然?

最佳答案

PostgreSQL 使用 RelationGetIndexList获取索引列表,评论说:

/*
* RelationGetIndexList -- get a list of OIDs of indexes on this relation
[...]
*
* The returned list is guaranteed to be sorted in order by OID. This is
* needed by the executor, since for index types that we obtain exclusive
* locks on when updating the index, all backends must lock the indexes in
* the same order or we will get deadlocks (see ExecOpenIndices()). Any
* consistent ordering would do, but ordering by OID is easy.
[...]
*/

OID(对象标识符)是向上计数的 4 字节无符号整数,因此通常较晚的对象会获得更高的 OID。这与您观察到的相符。

但是,一旦 OID 范围用完,它们就会环绕并从 FirstNormalObjectId (16384) 重新开始,因此无法保证首先创建的索引具有较低的 OID。

您可以使用如下查询:

SELECT 'indexname'::regclass::oid;

找到每个索引的OID。

要获取表上所有索引的 OID,请使用

SELECT indexrelid AS oid, indexrelid::regclass
FROM pg_index
WHERE indrelid = 'tablename'::regclass;

关于postgresql - 插入记录违反了 PostgreSQL 中的两个唯一索引。先检查哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55104384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com