我在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
);
一个看起来像这样的选择函数:
CREATE OR REPLACE FUNCTION "Population_SelectAll"()
RETURNS SETOF "Population" AS
$BODY$select
"Id",
"Name",
"Description",
"IsVisible"
from "Population";
$BODY$
LANGUAGE 'sql' STABLE
COST 100
调用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
);
和功能:
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;
在这些更改后调用该函数会导致以下错误消息:
ERROR: could not find attribute 11 in subquery targetlist
SQL state: XX000
导致此错误的原因是什么?如何解决?我试图删除并重新创建列和函数 - 但同样的错误发生。
Platform是在Windows Server上运行的PostgreSQL 8.4。感谢。
答案 0 :(得分:4)
你丢弃并重新创建了这个功能吗? 顺便说一下,你必须喜欢Postgres的用户友好性。您将拥抱和亲吻(XXOOO)作为错误状态的其他数据库是什么?
答案 1 :(得分:1)
当我在过去看过类似的东西时,那是因为数据库连接缓存了某些功能属性。因此,如果我使用pgAdmin,我必须关闭SQL编辑器窗口并建立新连接才能使函数正常工作。如果您还没有,请确保在新数据库连接上测试该功能。
我认为这个问题在PostgreSQL中已经修复了几个版本,但是值得一试。
答案 2 :(得分:0)
我发现解决方案更容易:创建数据库的备份并从此备份中恢复它。