2010-03-15 1432 views
2

我有Postgres的表看起來像這樣:PostgreSQL的 - 錯誤:SQL狀態:XX000

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 
); 

和功能:

調用後這些變化會導致以下錯誤消息的功能:

ERROR: could not find attribute 11 in subquery targetlist 
SQL state: XX000 

是什麼導致這個錯誤,我該如何解決它?我試圖刪除並重新創建列和函數 - 但發生同樣的錯誤。

平臺是運行在Windows Server上的PostgreSQL 8.4。謝謝。

+0

您是否在添加數據後填充了「Population」,「DefaultSpeciesId」和「DefaultEcotypeId」列? – Timothy 2010-03-15 14:02:05

+0

是的,我添加了列,向現有的錶行添加了一些值,然後在它們上設置「not null」和fk約束。 – rob 2010-03-16 10:22:25

回答

1

當我看到過去類似的東西時,這是因爲數據庫連接緩存了某些功能屬性。所以如果我使用pgAdmin,我必須關閉SQL編輯器窗口並建立一個新連接才能使函數正常工作。如果您還沒有,請確保您正在測試新的數據庫連接的功能。

我認爲這個問題在PostgreSQL中已經修復了幾個版本,但是值得一試。

+0

感謝您的建議 - 已經嘗試過,並沒有什麼區別。我從此解決了這個問題,刪除所有引用表的fks,直接刪除它,然後重新創建它。現在可以工作,但遠非理想的解決方案! – rob 2010-03-15 13:53:27

+0

我用postgresql 8.4和pgAdmin 1.10測試了這個。工作 – Alfabravo 2010-04-23 12:28:35

4

您是否丟棄並重新創建函數?順便說一下,你必須愛用戶友好的Postgres是如何。你會擁抱和親吻什麼其他數據庫(XXOOO)作爲錯誤狀態?

+3

是的,嘗試過 - 沒有快樂。 「用戶友好」和「Postgres」這兩個詞不應該被同時用在一起:p – rob 2010-03-16 15:56:28

+0

我喜歡你的XXOOO評論。 – joseglego 2017-10-05 18:52:39

0

對於我來說,解決方案有點簡單:創建數據庫的備份並從此備份中恢復它。