2011-12-07 16 views
13

Sto usando Ubuntu e PostgreSql 8.4.9.Il nome è una parola chiave speciale in PostgreSQL?

Ora, per qualsiasi tabella nel mio database, se faccio select table_name.name from table_name, mostra un risultato di colonne concatenate per ogni riga, anche se non ho nessuna colonna name nella tabella. Per le tabelle che hanno la colonna del nome, nessun problema. Qualche idea del perché?

I miei risultati sono come questo:

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

provare: selezionare "nome" dal limite di tagging 3; Inserisco sempre il nome di colonna/tabella tra virgolette, in questo modo posso denominare colonne/tabelle come "MySpecialColumn"/"MySuperDuperTable" – ComputerSaysNo

+0

appena testato, posso selezionare esattamente come vuoi, senza errori, tutto ha funzionato come previsto, i miei postgres la versione è 8.3, quindi penso che abbiate un punto di partenza per cercare il problema – ComputerSaysNo

risposta

20

Questa è una nota "caratteristica" confusa con un po 'di storia. In particolare, è possibile fare riferimento alle tuple dalla tabella nel suo complesso con il nome della tabella e quindi aggiungere .name invocherà la funzione name su di esse (ad esempio, sarebbe interpretata come select name(t) from t).

Ad un certo punto nello sviluppo di PostgreSQL 9, Istr è stato ripulito un po '. Puoi ancora fare esplicitamente select t from t per ottenere l'effetto righe-come-tuple, ma non puoi applicare una funzione allo stesso modo. Quindi, su PostgreSQL 8.4.9 , questo:

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

produce il bizzarro:

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

ma 9.1.1 produce:

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

come ci si aspetterebbe.

Quindi, per rispondere in modo specifico alla tua domanda: name è un tipo standard in PostgreSQL (utilizzato nel catalogo per i nomi delle tabelle ecc.) E anche alcune funzioni standard per convertire le cose nel tipo name. Non è in realtà riservato, solo gli oggetti che sono stati chiamati così, oltre a qualche sintassi strana e storica, hanno reso le cose confuse; e questo è stato risolto dagli sviluppatori nelle versioni recenti.

+0

In PostgreSQL 9.4.5, questo può ancora essere invocato quando si utilizza una sottoquery: 'selezionare x.name da (selezionare * da t) x;' –

3

Secondo the PostgreSQL documentation, name è una parola chiave "non riservati" in PostgreSQL, SQL: 2003, SQL: 1999, o SQL-92.

SQL distingue tra parole chiave riservate e non riservate. Secondo lo standard, le parole chiave riservate sono le uniche parole chiave reali; non sono mai ammessi come identificatori. Le parole chiave non riservate hanno un significato speciale solo in determinati contesti e possono essere utilizzate come identificatori in altri contesti. La maggior parte delle parole chiave non riservate sono in realtà i nomi delle tabelle e delle funzioni integrate specificate da SQL. Il concetto di parole chiave non riservate esiste essenzialmente solo per dichiarare che alcuni significati predefiniti sono associati a una parola in alcuni contesti.

La correzione suggerita quando si utilizza parole chiave è:

Come regola generale, se si ottiene gli errori del parser spuri per i comandi che contengono una delle parole chiave elencati come un identificatore si dovrebbe cercare di citare il identificatore per vedere se il problema scompare

Problemi correlati