2012-01-05 31 views
5

Soy nuevo en Postgresql y estoy tratando de migrar mi aplicación desde MySQL.
Tengo una tabla con la siguiente estructura:Comportamiento extraño en 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 

cuando corro la consulta a través de un programa en C utilizando libpq:

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

me dieron el siguiente resultado:

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

Obtengo exactamente el mismo error cuando trato de cambiar el valor de "Ejecutar" o cualquier otra columna usando pgAdminIII.

Todo funciona bien si cambio el nombre de columna de "Last_Update" a "last_update".

Encontré el mismo problema con otras tablas que tengo en mi base de datos y la columna siempre aparece con columnas de fecha y hora o de fecha y hora.

Respuesta

13

Su función update_tbl_point es probablemente haciendo algo como esto:

new.last_update = current_timestamp; 

pero debe utilizar de manera new."Last_Update" arreglar su función de disparo.

Los nombres de columna son normalized to lower case in PostgreSQL (lo contrario de lo que dice el estándar SQL que conste), pero identificadores que están entre comillas dobles mantienen su caso:

Citando un identificador también hace que sea entre mayúsculas y minúsculas, mientras que los nombres no cotizados son siempre doblado a minúsculas Por ejemplo, los identificadores FOO, foo y "foo" se consideran los mismos por PostgreSQL, pero "Foo" y "FOO" son diferentes de estos tres y de cada uno. (El plegado de los nombres no citados a minúsculas en PostgreSQL es incompatible con el estándar SQL, que dice que los nombres no citados deben doblarse a mayúsculas. Por lo tanto, foo debería ser equivalente a "FOO" y no a "foo" según el estándar. desea escribir aplicaciones portátiles se aconseja citar siempre un nombre particular o nunca citarlo)

Por lo tanto, si usted hace esto:.

create table pancakes (
    Eggs integer not null 
) 

continuación, puede realizar cualquiera de estas:

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

y funcionará porque las tres formas están normalizadas en eggs. Sin embargo, si usted hace esto:

create table pancakes (
    "Eggs" integer not null 
) 

entonces usted puede hacer esto:

update pancakes set "Eggs" = 11; 

pero no esto:

update pancakes set eggs = 11; 

La práctica habitual con PostgreSQL es el uso de identificadores en minúscula todas partes para que no tengas que preocuparte por eso También recomendaría el mismo esquema de nomenclatura en otras bases de datos, tener que citar todo simplemente te deja con un desorden de comillas dobles (estándar), respaldos (MySQL) y corchetes (SQL Server) en tu SQL y eso no hacerte amigos.

+0

¡Gracias mi amigo! ¡Tu explicación fue perfecta! Alexandra. – user1131031