最有效的“散列”功能是serial
主键 - 为您提供您在问题中希望的唯一编号。
我还在这个演示中处理重复项:
CREATE TEMP TABLE string (
string_id serial PRIMARY KEY
,string text NOT NULL UNIQUE -- no dupes
,ct int NOT NULL DEFAULT 1 -- count instead of dupe rows
);
然后你会像这样输入新的字符串:(
数据修改 CTE需要 PostgreSQL 9.1 或更高版本。)
WITH x AS (SELECT 'abc'::text AS nu)
, y AS (
UPDATE string s
SET ct = ct + 1
FROM x
WHERE s.string = x.nu
RETURNING TRUE
)
INSERT INTO string (string)
SELECT nu
FROM x
WHERE NOT EXISTS (SELECT 1 FROM y);
如果字符串nu
已经存在,则计数 ( ct
) 增加 1。如果不存在,则插入新行,从计数 1 开始。
UNIQUE
还会自动在列上添加索引,string.string
从而为该查询带来最佳性能。
UPDATE
为/添加额外的逻辑(触发器?)DELETE
以使其防弹 - 如果需要。
请注意,如果两个并发事务试图在同一时间添加相同的字符串,这里有一个非常小的竞争条件。可以肯定的是,您可以使用SERIALIZABLE
事务。此相关问题下的更多信息和链接。