首页 文章

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

提问于
浏览
0

我在Windows上使用PostgreSQL 9.1 .

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

Question 1

这是 INSERT INTOJOIN 最好的方法吗?

Question 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 回答

  • 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;
    

    第一件事是: SELECT 将哪些列写入 SELECT 产生的东西?你必须像这样指定它:

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

    关于错误类型的奇怪消息可能是由此引起的 .

    第二件事是:

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

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

    所以:

    • 修复 INSERT 部分

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

    哦,是的,问题一:只要 SELECT 查询产生正确的数据,就足以在_1015062中使用:-)如果 JOIN 有助于产生正确的数据 - 那没关系 .

相关问题