我有一個表ContentAddressedFiles
其中列hash
,size
和extension
的組合是UNIQUE
。我想創建一個被調用的存儲過程,它會使用給定的值向表中插入一條新記錄。如果這些值的記錄已經存在,我想只返回該現有記錄。這裏是我的方法:無法選擇UNIQUE VIOLATION的原因
CREATE OR REPLACE FUNCTION INIT_CAF(id_in_case_of_new UUID, _hash VARCHAR(255), _size INTEGER, _extension VARCHAR(255), _mimeType VARCHAR(255))
RETURNS "ContentAddressedFiles"
AS $$
DECLARE
caf "ContentAddressedFiles"%ROWTYPE;
BEGIN
INSERT INTO "ContentAddressedFiles" (id, hash, size, extension, "mimeType", "createdAt", "updatedAt")
VALUES(id_in_case_of_new, _hash, _size, _extension, _mimeType, NOW(), NOW()) RETURNING * INTO caf;
RETURN caf;
EXCEPTION WHEN unique_violation THEN
SELECT * FROM "ContentAddressedFiles" INTO caf WHERE "hash" = _hash AND "size" = _size AND "extension" = _extension;
IF NOT FOUND THEN
RAISE EXCEPTION 'This should never happen.';
END IF;
RETURN caf;
END;
$$ LANGUAGE plpgsql;
然而,當我從打電話併發事務的過程中,我始終得到異常:
EXCEPTION: This should never happen.
這怎麼可能?該程序似乎並不能夠前SELECT
發生故障的INSERT
的原因(這不是衝突,它是<hash, size, extension>
只是元組中的id
讓你看到升起exveption和空值而不是預期的行?..請加你輸出的問題 –
是的,正是我得到的異常,當我從不同的事務同時運行的程序。 – DeX3
http://stackoverflow.com/questions/6722344/select-or-insert-a-row-in-one-command –