PostgreSQL触发器选择并将数据写入新表格
-
26-10-2019 - |
题
我在Windows上使用PostgreSQL 9.1。
我将数据从计算机自动收集到PostgreSQL DB中,这正常工作。数据被保存在几个表中,我感兴趣的数据称为 testrecord
. 。我有第二个静态表称为 testcode
和桌子之间的联接。我想在 testrecord
并填充一张名为的新表格 finaldata
, ,在那里有一场比赛 parameter
和 testid
不是空白(null)。
问题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;
解决方案
你写了:
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
有助于产生正确的数据 - 没关系。
不隶属于 StackOverflow