Postgresql触发器选择并将数据写入新表

时间:2012-02-16 11:03:30

标签: postgresql triggers postgresql-9.1

我在Windows上使用PostgreSQL 9.1。

我正在从机器自动收集数据到PostgreSQL数据库,这是正常的。数据保存在几个表中,我感兴趣的表称为testrecord。我有一个名为testcode的第二个静态表和表之间的连接。我想在testrecord中选择一些传入数据并填充一个名为finaldata的新表格,其中parametertestid匹配,而非空白({1}}空值)。

问题1

INSERT INTOJOIN这是最好的方法吗?

问题2

目前所有的字段都是varchar。当我添加一个整数字段 在表finaldata中(例如自动递增序列)我得到了 column "FdataID" is of type integer but expression is of type character varyingcolumn "FdataID" is of type integer but expression is of type record

等消息

我的功能代码如下:

INSERT INTO finaldata 
    SELECT 
        "testrecord"."Record", 
        "testrecord"."Sample", 
        "testrecord"."SampleOrig",
        "testrecord"."Parameter", 
        "testrecord"."Result", 
        "testrecord"."ResultOrig", 
        "testrecord"."Units", 
        "testrecord"."OperatorID", 
        "testrecord"."ObsTime", 
        "testrecord"."MsgTime", 
        "testcode"."Machine", 
        "testcode"."TestName", 
        "testcode"."ShortTestName", 
        "testcode"."TestID"
    FROM testrecord 
        LEFT OUTER JOIN testcode 
            ON  ("testrecord"."Parameter" = "testcode"."Parameter") 
            AND ("testrecord"."Machine" = "testcode"."Machine")
    WHERE ("testcode"."TestID") IS NOT NULL; 

1 个答案:

答案 0 :(得分:1)

您写道:

INSERT INTO finaldata 
    SELECT "testrecord"."Record", /* some column skipped */ 
        FROM testrecord LEFT OUTER JOIN testcode ON ("testrecord"."Parameter" = "testcode"."Parameter") AND ("testrecord"."Machine" = "testcode"."Machine")
        WHERE ("testcode"."TestID") IS NOT NULL; 

第一件事是:INSERT部分的哪些列应SELECT写出?你必须这样指定:

INSERT INTO finaldata ("Record", ...)
    SELECT "testrecord"."Record", /* some column skipped */ 
    ...

关于错误类型的奇怪消息可能是由此造成的。

第二件事是:

... WHERE ("testcode"."TestID") IS NOT NULL; 

任何你暗示你想在函数中使用这个代码(我猜的触发函数)。每次调用此语句都不会只在finaldata中插入一个新行,而是插入所有内容。那么重复的条目就是某种东西。

所以:

  • 修复INSERT部分
  • 修复SELECT部分中缺少的限定符。

哦,是的,问题一:只要SELECT查询产生正确的数据,就足以在INSERT内使用:-)如果JOIN有帮助产生正确的数据 - 没关系。