我正在使用觸發器函數將數據寫入Postgresql 9.1中的新表。一切都在正常工作,但我得到重複。我可以使用外鍵約束來防止重複產生嗎?我之前沒有使用外鍵約束。postgresql外鍵約束,以防止重複
這裏是表結構
DROP TABLE "obx" CASCADE;
CREATE TABLE "obx" (
"obxID" serial primary key,
"Pid" varchar,
"Sid" varchar,
"SidOrig" varchar,
"Parameter" varchar,
"Result" varchar,
"ResultOrig" varchar,
"Units" varchar,
"RefRange" varchar,
"Flag" varchar,
"FlagOrig" varchar,
"OperatorID" varchar,
"ObsTime" char(14),
"MsgTime" char(14),
"UnixTime" int4,
"Analyzer" varchar,
"Segment" varchar
);
DROP TABLE "testcode" CASCADE;
CREATE TABLE "testcode" (
"TcodeID" serial primary key,
"Analyzer" varchar,
"Parameter" varchar,
"TestName" varchar,
"ShortTestName" varchar,
"TestID" int4
) ;
DROP TABLE "finaldata" CASCADE;
CREATE TABLE "finaldata" (
"FdataID" serial primary key,
"Pid" varchar,
"Sid" varchar,
"SidOrig" varchar,
"Parameter" varchar,
"Result" varchar,
"ResultOrig" varchar,
"Units" varchar,
"OperatorID" varchar,
"ObsTime" varchar,
"MsgTime" varchar,
"Analyzer" varchar,
"TestName" varchar,
"ShortTestName" varchar,
"TestID" varchar,
"XYchar1" varchar,
"XYchar2" varchar,
"XYchar3" varchar,
"XYint1" int4,
"XYint2" int4,
"XYint3" int4,
"XYGuid" uuid
) ;
和觸發功能:
BEGIN
INSERT INTO finaldata ("Pid", "Sid", "SidOrig", "Parameter", "Result", "ResultOrig", "Units"
, "OperatorID", "ObsTime", "MsgTime", "Analyzer", "TestName", "ShortTestName", "TestID")
SELECT ob."Pid", ob."Sid", ob."SidOrig", ob."Parameter", ob."Result", ob."ResultOrig", ob."Units"
, ob."OperatorID", ob."ObsTime", ob."MsgTime", ob."Analyzer"
, tc."TestName", tc."ShortTestName", tc."TestID"
FROM obx ob
JOIN testcode tc ON ob."Parameter" = tc."Parameter"
WHERE ob."Sid" = NEW."Sid"
AND ob."ObsTime" = NEW."ObsTime"
AND ob."Parameter" = NEW."Parameter"
AND ob."Analyzer" = NEW."Analyzer"
AND tc."TestID" IS NOT NULL
;
RETURN NEW;
END;
OP之前曾問過這個問題兩次。根本的問題是他的數據模型是不確定的:最終數據表複製了obx的大部分數據(只有對主鍵的引用就足夠了)甚至「參數」字段也不是候選鍵的一部分,因爲它完全功能上依賴於PK(obx) - >參數。一個獨特的FK(obx.ObxId就足夠了)我休息我的情況。 – wildplasser 2012-03-19 15:01:06
我曾問過一個相關的問題,但那是關於觸發器。觸發器部分正在工作。最終數據表是大量信息的副本,但另一個系統連接到數據庫並通過ODBC從最終數據表中讀取數據。這就是它爲什麼設置的原因。現在只有一些重複,我確定唯一的約束和外鍵將整理其餘的。謝謝 – user1044111 2012-03-19 15:29:21
唯一約束成功阻止重複。不幸的是它也阻止了想要的記錄機器分批發送記錄 - 例如可能有10條記錄。 6是需要的,觸發器可以正確地對它們進行過濾 - 除了生成一些重複項(通常是1或2)。我現在試着在觸發器上使用觸發器,看看它是否有效。感謝您的解釋和@wildplasser早期幫助觸發器。 – user1044111 2012-03-20 12:23:55