2012-01-05 29 views
5

Postgresql uygulamasında yeniyim ve başvurumu MySQL'den geçirmeye çalışıyorum.
Aşağıdaki yapıya sahip bir tablo vardır:Postgresql'deki garip davranış

      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 

I libpq kullanılarak C program sorgu çalıştırmak:

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 

Aşağıdaki çıkış var "Execute" veya pgAdminIII kullanarak başka bir sütunun değerini değiştirmeye çalıştığımda tam olarak aynı hatayı alıyorum.

"Last_Update" ile "last_update" arasındaki sütun adını değiştirirseniz her şey iyi çalışır.

Veritabanımdaki diğer tablolarda da aynı sorunu buldum ve sütun her zaman abstime veya zaman damgası sütunlarıyla görünüyor.

new.last_update = current_timestamp; 

ama o kadar tetik işlevini düzeltmek new."Last_Update" kullanarak edilmelidir:

cevap

13

Sizin update_tbl_point fonksiyon muhtemelen böyle bir şey yapıyor.

Sütun adları normalized to lower case in PostgreSQL olan (SQL standardı ne diyor tersi mind) ancak çift tırnaklı olur tanımlayıcılar savunmalarını korumak: tırnaksız isimler ise, ayrıca bir tanımlayıcı aktaran

o harfe duyarlı hale getirir küçük harflere daima katlanır. Örneğin, FOO, foo ve "foo" tanımlayıcıları PostgreSQL tarafından aynı kabul edilir, ancak "Foo" ve "FOO" bu üç ve birbirinden farklıdır. (PostgreSQL'de kote olmayan isimlerin küçük harflere katlanması, SQL standardına uygun değildir, bu nedenle, seçilmemiş isimlerin büyük harflere katlanması gerektiğini söyler. Bu nedenle, foo, standarda göre "FOO" değil "foo" ya eşdeğer olmalıdır. Eğer her zaman belirli bir isim alıntı ya da asla bunu alıntı tavsiye edilir taşınabilir uygulamaları yazmak istiyorum)

Yani, bunu yaparsanız.

create table pancakes (
    Eggs integer not null 
) 

sonra Bunlardan herhangi birini yapabilirsiniz:

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

ve her üç formun da eggs normale döndüğü için çalışacaktır. bunu yaparsanız Ancak bu:

create table pancakes (
    "Eggs" integer not null 
) 

o zaman bunu yapabilirsiniz:

update pancakes set "Eggs" = 11; 

ancak bu:

PostgreSQL ile olağan uygulama her yerde küçük harf tanımlayıcıları kullanmaktır
update pancakes set eggs = 11; 

böylece bunun için endişelenmenize gerek yok. Diğer veritabanlarında da aynı adlandırma şemasını öneririm, herşeyi size sadece SQL'de çift tırnak (standart), backticks (MySQL) ve parantez (SQL Server) karmaşasına neden olacak şekilde teklif etmem gerekir Seni arkadaş edin.

+0

Teşekkür ederim arkadaşım! Açıklamanız kusursuzdu! Alexandra. – user1131031

İlgili konular