【发布时间】:2012-03-25 22:21:11
【问题描述】:
postgresql 9.1 DB 写入从机器自动发送的数据。这很好用。
我有一个 AFTER INSERT ...FOR EACH ROW 触发器 - 这也有效。 触发器通过查看另一个表来工作,如果字段中有值,它就会触发。
我有两个问题 - 一种。一些机器发送超过 1 个结果。我使用 LIMIT 1 来防止重复,这意味着我错过了来自发送多个结果的机器的数据。有什么替代方法? 湾。有些机器共享相同的测试代码,我找不到一种方法来限定它,以便在我使用 NEW 值时使其在 SELECT 中特定于机器。这是代码
CREATE FUNCTION testcode_matches()
RETURNS TRIGGER as $$
DECLARE
var INTEGER;
name text;
short text;
id integer;
BEGIN
SELECT count("TestID") from testcode WHERE "testcode"."Parameter" = NEW."Parameter" into var;
IF var > 0 THEN
SELECT "TestName", "ShortTestName", "TestID"
from testcode where "Parameter" = NEW."Parameter" Limit 1 into name, short, id;
INSERT INTO finaldata /* various fields */
SELECT /* various fields */ name, short, id
from obx
WHERE "obx"."Parameter" = NEW."Parameter"
LIMIT 1;
END if;
RETURN NEW;
END;
$$ language plpgsql;
【问题讨论】:
-
您是否期望来自
from testcode where "Parameter" = NEW."Parameter"查询的ID 不止一个?在这种情况下:LIMIT 1;导致随机 id 被检索(并插入到 finaldata 中)。恕我直言,您可以将所有 {testcode,obx} 放入子查询中,并省略所有变量。查询将变成普通的 SQL。 ASO:您可以添加表定义和触发器本身吗? -
我
ve received another answer below which has helped me out but Im 有兴趣了解子查询。你能建议一个链接让我看看吗?触发器本身是 -- 表 "public"."obx" 的触发器结构 -- ---------------------------- CREATE TRIGGER " finaldata_matches”在“public”上插入之后。“obx”对于每一行执行过程“testcode_matches”();
标签: function postgresql triggers duplicates