2012-01-05 194 views
5

我是Postgresql的新手,我試圖從MySQL遷移我的應用程序。
我有以下結構的表:Postgresql中的奇怪行爲

      Table "public.tbl_point" 
      Column   |   Type   | Modifiers | Storage | Description 
------------------------+-----------------------+-----------+----------+------------- 
    Tag_Id     | integer    | not null | plain | 
    Tag_Name    | character varying(30) | not null | extended | 
    Quality    | integer    | not null | plain | 
    Execute    | integer    | not null | plain | 
    Output_Index   | integer    | not null | plain | 
    Last_Update   | abstime    |   | plain | 
Indexes: 
"tbl_point_pkey" PRIMARY KEY, btree ("Tag_Id") 
Triggers: 
add_current_date_to_tbl_point BEFORE UPDATE ON tbl_point FOR EACH ROW EXECUTE PROCEDURE update_tbl_point() 
Has OIDs: no 

當我使用libpq的運行通過一個C程序查詢:

UPDATE tbl_point SET "Execute"=0 WHERE "Tag_Id"=0 

我得到了以下的輸出:

ERROR: record "new" has no field "last_update" 
CONTEXT: PL/pgSQL function "update_tbl_point" line 3 at assignment 

當我嘗試使用pgAdminIII更改「Execute」或任何其他列的值時,我會得到完全相同的錯誤。

如果我將列名從「Last_Update」更改爲「last_update」,一切正常。

我在我的數據庫中發現了與其他表相同的問題,並且該列始終與abstime或timestamp列一起出現。

回答

13

update_tbl_point功能可能做這樣的事情:

new.last_update = current_timestamp; 

,但它應該使用new."Last_Update"所以解決您的觸發功能。

列名是normalized to lower case in PostgreSQL(的SQL標準說的正好相反介意你),但在雙引號的標識符保持自己的情況:

把一個標識符也使得它區分大小寫的,而帶引號的名稱總是摺疊成小寫。例如,PostgreSQL認爲標識符FOO,foo和「foo」是相同的,但是「Foo」和「FOO」與這三者和彼此不同。 (在PostgreSQL中將未加引號的名字摺疊爲小寫字母與SQL標準不兼容,這表示非加引號的名字應該摺疊爲大寫字母,因此,根據標準,foo應該等同於「FOO」而不是「foo」。你想寫便攜式應用建議您總是給一個特定的名稱或從不引用它)

所以,如果你這樣做:

create table pancakes (
    Eggs integer not null 
) 

那麼你可以做任何這些:

update pancakes set eggs = 11; 
update pancakes set Eggs = 11; 
update pancakes set EGGS = 11; 

,它會工作,因爲所有三種形式歸一化爲eggs。但是,如果你這樣做:

create table pancakes (
    "Eggs" integer not null 
) 

,那麼你可以這樣做:

update pancakes set "Eggs" = 11; 

但不是這樣的:

update pancakes set eggs = 11; 

PostgreSQL的通常的做法是到處使用小寫字母標識符所以你不必擔心它。我建議在其他數據庫中使用相同的命名方案,在SQL中引用所有內容只會導致一堆雙引號(標準),反引號(MySQL)和括號(SQL Server),並且不會讓你有任何朋友。

+0

謝謝我的朋友!你的解釋是完美的!亞歷山德拉。 – user1131031 2012-01-05 01:28:50