我有這個表爲什麼以前驗證時查詢會返回PK衝突?
CREATE TABLE "UserCouponSentMail"
(
"IdUser" integer NOT NULL,
"IdCoupon" integer NOT NULL,
"SendType" character varying(100),
"Date" timestamp without time zone NOT NULL DEFAULT ('now'::text)::timestamp without time zone,
CONSTRAINT "pk_UserCouponSentMail" PRIMARY KEY ("IdUser" , "IdCoupon"),
CONSTRAINT "pk_UserCouponSentMail_GroceryCoupon" FOREIGN KEY ("IdCoupon")
REFERENCES "GroceryCoupon" ("IdGroceryCoupon") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
這個功能
CREATE OR REPLACE FUNCTION "UserCouponSentMailInsertOrUpdate"(integer, integer, character varying, timestamp without time zone)
RETURNS void AS
$BODY$
BEGIN
IF (EXISTS(SELECT * FROM "UserCouponSentMail" WHERE "IdUser" = $1 AND "IdCoupon" = $2)) THEN
UPDATE "UserCouponSentMail" SET
"SendType" = $3,
"Date" = $4
WHERE
"IdUser" = $1 AND "IdCoupon" = $2;
ELSE
INSERT INTO "UserCouponSentMail" VALUES ($1, $2, $3, $4);
END IF;
RETURN;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
而且我不知道爲什麼,但不知何故,我同時運行的功能
Unique violation: 7 ERROR: duplicate key value violates unique constraint "pk_UserCouponSentMail" CONTEXT: SQL statement "INSERT INTO "UserCouponSentMail" VALUES ($1 , $2 , $3 , $4)" PL/pgSQL function "UserCouponSentMailInsertOrUpdate" line 9 at SQL statement
任何有時會收到此錯誤想法如何發生?
兩個腳本幾乎不可能在同一時間以相同的參數運行這個函數。
我在x86_64-redhat-linux-gnu上使用PostgreSQL 8.4.11,由GCC gcc(GCC)4.4.6 20110731(Red Hat 4.4.6-3)編譯,64位。
謝謝。