如何保证postgres实体化视图的唯一int(或bigint)键



我想知道我是否可以使用postgres视图(或物化视图)而不是表来实现这一点。

要求:我需要视图上的唯一ID,必须始终属于同一行。我的第一个想法是组合键—在我的视图中有两个整数字段,当它们组合在一起时将是唯一的。当然,(52,6)和(5,26)组合起来看起来是一样的。

作为per是否有一个简单的方法来创建一个唯一的整数键从两个整数组合键?为视图创建一个唯一的复合bigint值似乎需要很多复杂的数学运算,但我觉得这可能有点难以维护。

我想知道是否有任何物化视图可能提供,以确保ID始终是唯一的,不改变,即使视图被刷新。

我已经尝试过Row_number() over,但这被排除了,虽然它是唯一的,但它每次都在变化。

如果没有简单的方法,我正在考虑使用一个表来解决这个问题。

如果您需要一个包含int1和int2两列的表,那么在表中的int1和/或int2更新之前,id = (int1 * 2^32 + int2) :: bigint不会更改。然后,这个id可以作为bigint类型的新列存储在表中,或者您可以在该表上创建一个索引,该索引将在查询该表时使用该id:

CREATE OR REPLACE FUNCTION bigint_id(int1 integer, int2 integer)
RETURNS bigint LANGUAGE sql AS
$$
SELECT (int1 * 2^32 + int2) :: bigint ;
$$ ;
CREATE INDEX bigint_id ON your_table USING btree (bigint_id(int1, int2)) ;

下面的查询将使用bigint_id索引:

SELECT * FROM your_table WHERE bigint_id(int1, int2) = nnnn