我在Postgres中有一张桌子,看起来像这样:
CREATE TABLE "Population"
(
"Id" bigint NOT NULL DEFAULT nextval('"population_Id_seq"'::regclass),
"Name" character varying(255) NOT NULL,
"Description" character varying(1024),
"IsVisible" boolean NOT NULL
CONSTRAINT "pk_Population" PRIMARY KEY ("Id")
)
WITH (
OIDS=FALSE
);
Run Code Online (Sandbox Code Playgroud)
选择函数如下所示:
CREATE OR REPLACE FUNCTION "Population_SelectAll"()
RETURNS SETOF "Population" AS
$BODY$select
"Id",
"Name",
"Description",
"IsVisible"
from "Population";
$BODY$
LANGUAGE 'sql' STABLE
COST 100
Run Code Online (Sandbox Code Playgroud)
调用select函数将按预期返回表中的所有行。
我需要在表中添加几列(这两列都是数据库中其他表的外键)。这给了我一个新的表def,如下所示:
CREATE TABLE "Population"
(
"Id" bigint NOT NULL DEFAULT nextval('"population_Id_seq"'::regclass),
"Name" character varying(255) NOT NULL,
"Description" character varying(1024),
"IsVisible" boolean NOT NULL,
"DefaultSpeciesId" bigint NOT NULL,
"DefaultEcotypeId" bigint NOT NULL,
CONSTRAINT "pk_Population" PRIMARY KEY ("Id"),
CONSTRAINT "fk_Population_DefaultEcotypeId" FOREIGN KEY ("DefaultEcotypeId")
REFERENCES "Ecotype" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT "fk_Population_DefaultSpeciesId" FOREIGN KEY ("DefaultSpeciesId")
REFERENCES "Species" ("Id") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
Run Code Online (Sandbox Code Playgroud)
和功能:
CREATE OR REPLACE FUNCTION "Population_SelectAll"()
RETURNS SETOF "Population" AS
$BODY$select
"Id",
"Name",
"Description",
"IsVisible",
"DefaultSpeciesId",
"DefaultEcotypeId"
from "Population";
$BODY$
LANGUAGE 'sql' STABLE
COST 100
ROWS 1000;
Run Code Online (Sandbox Code Playgroud)
这些更改后调用该函数将导致以下错误消息:
ERROR: could not find attribute 11 in subquery targetlist
SQL state: XX000
Run Code Online (Sandbox Code Playgroud)
是什么导致此错误,我该如何解决?我试图删除并重新创建列和函数-但发生相同的错误。
平台是Windows Server上运行的PostgreSQL 8.4。谢谢。
您是否删除并重新创建了功能?顺便说一下,您一定喜欢Postgres的用户友好程度。您还会拥抱和亲吻(XXOOO)哪个其他数据库作为错误状态?