【问题标题】:Postgresql trigger to select and write data into new tablePostgresql 触发器选择数据并将其写入新表
【发布时间】:2012-03-07 18:48:21
【问题描述】:

我在 Windows 上使用 PostgreSQL 9.1。

我正在自动将数据从机器收集到 PostgreSQL 数据库中,并且工作正常。数据被保存在几个表中,我感兴趣的一个叫做testrecord。我有第二个名为testcode 的静态表和表之间的连接。我想选择testrecord 中的一些传入数据并填充一个名为finaldata 的新表,其中parametertestid 匹配,它不是空白(空)。

问题 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; 

【问题讨论】:

    标签: postgresql triggers postgresql-9.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; 
    

    第一件事是:INSERT 应将SELECT 部分产生的内容写入哪些列?您必须像这样指定它:

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

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

    第二件事是:

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

    任何你暗示你想在一个函数中使用这个代码(我猜是触发器函数)。对该语句的每次调用都不会只是在finaldata 中插入一个新行,它会插入所有内容。重复的条目是肯定的。

    所以:

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

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

    【讨论】:

    • 太棒了 - 你让我走上了正确的道路 - 我不再收到奇怪的消息并且数据被正确插入。你也是对的,我得到了重复 - 我不知道如何解决这个问题。我想要发生的是当表之间的参数值匹配时,在新表 finaldata 中创建一条记录。也许我应该问一个新问题?
    • 我假设您的触发器是附加到表testrecord 的行级触发器。在您的触发函数中,您可以访问“神奇”行NEWOLD,其中包含testrecord 的新旧数据。您可以使用这些将过滤器添加到您的SELECT。我对您的数据一无所知,但根据列名的疯狂猜测是:WHERE testcode."TestID" = NEW."TestID" 您可以在“触发器”部分的 PostgreSQL 文档中查找OLDNEW 的详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2012-06-17
    • 2012-11-20
    • 2020-07-07
    • 2021-07-11
    • 2017-07-27
    相关资源
    最近更新 更多