Триггер Postgresql для выбора и записи данных в новую таблицу - PullRequest
0 голосов
/ 16 февраля 2012

Я использую PostgreSQL 9.1 для Windows.

Я автоматически собираю данные с компьютера в базу данных PostgreSQL, и это работает правильно.Данные сохраняются в нескольких таблицах, и одна из них, которая меня интересует, называется testrecord.У меня есть вторая статическая таблица с именем testcode и соединение между таблицами.Я хочу выбрать некоторые из входящих данных в testrecord и заполнить новую таблицу с именем finaldata, где есть совпадение для parameter и testid, которое не является пустым (ноль).

Вопрос 1

Является ли INSERT INTO и JOIN лучшим способом сделать это?

Вопрос 2

Все поля на данный момент являются varchar.Когда я добавляю целое поле в таблицу finaldata (например, с последовательным автоматическим увеличением), я получаю сообщения, такие как column "FdataID" is of type integer but expression is of type character varying или column "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 голос
/ 16 февраля 2012

Вы писали:

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 помогает получить правильные данные - - все в порядке.

...