2011-12-07 21 views
13

Estoy usando Ubuntu y PostgreSql 8.4.9.¿Es el nombre una palabra clave especial en PostgreSQL?

Ahora, para cualquier tabla en mi base de datos, si hago select table_name.name from table_name, muestra un resultado de columnas concatenadas para cada fila, aunque no tengo ninguna columna name en la tabla. Para las tablas que tienen columna de nombre, no hay problema. ¿Alguna idea de por qué?

Mis resultados son como sigue:

select taggings.name from taggings limit 3; 

--------------------------------------------------------------- 
(1,4,84,,,PlantCategory,soil_pref_tags,"2010-03-18 00:37:55") 
(2,5,84,,,PlantCategory,soil_pref_tags,"2010-03-18 00:37:55") 
(3,6,84,,,PlantCategory,soil_pref_tags,"2010-03-18 00:37:55") 
(3 rows) 


select name from taggings limit 3; 
ERROR: column "name" does not exist 
LINE 1: select name from taggings limit 3; 
+0

try: selecciona "nombre" del taggings limit 3; Siempre puse nombre de columna/tabla entre comillas dobles, de esta manera puedo nombrar columnas/tablas como "MySpecialColumn"/"MySuperDuperTable" – ComputerSaysNo

+0

que acabo de probar, puedo seleccionar exactamente como desee, sin error, todo funcionó como esperaba, mi postgres la versión es 8.3, así que creo que tiene un punto de partida para buscar el problema – ComputerSaysNo

Respuesta

20

Esta es una "característica" confusa conocida con un poco de historia. Específicamente, podría hacer referencia a las tuplas de la tabla como un todo con el nombre de la tabla y, a continuación, al agregar .name se invocaría la función name en ellas (es decir, se interpretaría como select name(t) from t).

En algún punto del desarrollo de PostgreSQL 9, Istr esto se limpió un poco. Todavía puede hacer select t from t explícitamente para obtener el efecto de filas como tuplas, pero no puede aplicar una función de la misma manera. Así que en PostgreSQL 8.4.9 , esto:

create table t(id serial primary key, value text not null); 
insert into t(value) values('foo'); 
select t.name from t; 

produce el extraño:

name 
--------- 
(1,foo) 
(1 row) 

sino en 9.1.1 produce:

ERROR: column t.name does not exist 
LINE 1: select t.name from t; 
      ^

como era de esperar.

Por lo tanto, para responder específicamente a su pregunta: name es un tipo estándar en PostgreSQL (utilizado en el catálogo de nombres de tablas, etc.) y también algunas funciones estándar para convertir cosas al tipo name. En realidad, no está reservado, solo los objetos que existen se llaman así, más alguna sintaxis extraña histórica, hace que las cosas sean confusas; y esto ha sido arreglado por los desarrolladores en versiones recientes.

+0

En PostgreSQL 9.4.5, esto aún se puede invocar cuando se utiliza una subconsulta: 'seleccionar x.nombre de (seleccione * de t) x;' –

3

Según the PostgreSQL documentation, name es una palabra clave "no reservados" en PostgreSQL, SQL: 2003, SQL: 1999 o SQL-92.

SQL distingue entre palabras clave reservadas y no reservadas. De acuerdo con el estándar, las palabras clave reservadas son las únicas palabras clave reales; nunca están permitidos como identificadores. Las palabras clave no reservadas solo tienen un significado especial en contextos particulares y se pueden usar como identificadores en otros contextos. La mayoría de las palabras clave no reservadas son en realidad los nombres de las tablas y funciones incorporadas especificadas por SQL. El concepto de palabras clave no reservadas esencialmente solo existe para declarar que algún significado predefinido se adjunta a una palabra en algunos contextos.

La solución sugerida cuando se utilizan palabras clave es:

Como regla general, si se producen errores de parser no esenciales en los comandos que contienen cualquiera de las palabras clave que figuran como un identificador que debe tratar de citar el identificador para ver si el problema desaparece.

Cuestiones relacionadas