我正在使用触发器函数将数据写入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