2012-01-05 36 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プログラムを通じてクエリを実行すると:

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

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

は、私は次の出力を得ましたpgAdminIIIを使って "Execute"や他の列の値を変更しようとすると、まったく同じエラーが出ます。

"Last_Update"から "last_update"に列名を変更すると、すべて正常に機能します。

私は自分のデータベースにある他のテーブルと同じ問題を発見しました。カラムは常にabstimeカラムまたはtimestampカラムとともに表示されます。

new.last_update = current_timestamp; 

をので、あなたのトリガ機能を修正new."Last_Update"を使用する必要があります。

答えて

13

あなたupdate_tbl_point機能は、おそらくこのような何かをやっています。

列名はnormalized to lower case in PostgreSQLある(SQL標準では、あなたの心言うの反対側)が、二重引用符で囲まれたされた識別子は、彼らのケースを維持する:引用符で囲まれていない名前であるのに対し、識別子を引用

も、それは大文字と小文字を区別します常に小文字に折り畳まれています。たとえば、識別子FOO、foo、および "foo"はPostgreSQLで同じと見なされますが、 "Foo"と "FOO"はこれら3つのものと異なっています。 (PostgreSQLでは、引用符のない名前を小文字に変換することはSQL標準と互換性がないため、引用符で囲まれていない名前は大文字に変換する必要がありますので、fooは標準に従って "FOO"あなたは、あなたが常に特定の名前を引用またはそれを引用しないように助言されるポータブル・アプリケーションを書きたい)

だから、あなたがこれを行う場合:

create table pancakes (
    Eggs integer not null 
) 

を、あなたはこれらのいずれかの操作を行うことができます

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

となり、3つのフォームはいずれもeggsに正規化されているため動作します。あなたがこれを行う場合は、:

update pancakes set "Eggs" = 11; 

ではなく、この:

update pancakes set eggs = 11; 

のPostgreSQLとの通常の練習はどこでも小文字の識別子を使用することです

create table pancakes (
    "Eggs" integer not null 
) 

を、あなたはこれを行うことができますあなたはそれを心配する必要はありません。私は、他のデータベースでも同じ名前付けスキームをお勧めしたいと思います。すべてを引用すると、二重引用符(標準)、バッククォート(MySQL)、およびブラケット(SQL Server)がSQLに残されます。あなたにお友達を作りましょう。

+0

ありがとう、私の友人!あなたの説明は完璧でした!アレクサンドラ – user1131031