PostgreSQL Trigger для выбора и записи данных в новую таблицу
-
26-10-2019 - |
Вопрос
Я использую PostgreSQL 9.1 в Windows.
Я автоматически собираю данные с машины в дБ PostgreSQL, и это работает правильно. Данные сохраняются в нескольких таблицах, и мне интересно, что меня заинтересованы testrecord
. Анкет У меня есть вторая статическая таблица под названием testcode
и соединение между таблицами. Я хочу выбрать некоторые из входящих данных в testrecord
и заполнить новую таблицу под названием finaldata
, где есть совпадение на parameter
и testid
который не является пустым (ноль).
Вопрос 1
Является INSERT INTO
а также JOIN
Лучший способ сделать это?
вопрос 2
Все поля на данный момент - варчар. Когда я добавляю целочисленное поле в таблицу finaldata
(например, сериал Auto Increming) Я получаю сообщения, такие как 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;
Решение
Вы написали:
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
Помогает создать правильные данные - это нормально.