すべての中で最も効果的な「ハッシュ」関数は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
して、これを防弾にします - 必要に応じて。
ここで、2 つの同時トランザクションが同じ文字列を同時に追加しようとすると、非常に小さな競合状態が発生することに注意してください。確かに、SERIALIZABLE
トランザクションを使用できます。この関連する質問の下の詳細情報とリンク。