Non riesco a trovare la documentazione che descriva i formati validi di un nome di schema PostgreSQL. So che un nome di schema non può:
- inizia con un numero
- avere spazi
- iniziare con
pg_
Cos'altro? Dove dovrei guardare?
Non riesco a trovare la documentazione che descriva i formati validi di un nome di schema PostgreSQL. So che un nome di schema non può:
pg_
Cos'altro? Dove dovrei guardare?
Risposte:
Secondo l'ottima documentazione , penso che questo potrebbe essere quello che stai cercando.
Gli identificatori SQL e le parole chiave devono iniziare con una lettera (az, ma anche lettere con segni diacritici e lettere non latine) o un trattino basso (_). I caratteri successivi in un identificatore o parola chiave possono essere lettere, caratteri di sottolineatura, cifre (0-9) o segni di dollaro ($). Nota che i simboli di dollaro non sono consentiti negli identificatori secondo la lettera dello standard SQL, quindi il loro uso potrebbe rendere le applicazioni meno portatili ...
pg_
sottolineatura a questo link, come Nathan C menzionato .
Secondo la documentazione , inoltre, non può iniziare pg_
perché è riservato. A parte questo sembra abbastanza libero.
this-is schema
e sarebbe comunque un nome di schema non valido.
La risposta corretta è quella fornita da gsiems. Tuttavia, desidero sottolineare che PostgreSQL ha delle regole sugli identificatori tra virgolette che potresti tenere a mente. "Gli identificatori tra virgolette possono contenere qualsiasi carattere, tranne il carattere con codice zero. (Per includere una virgoletta doppia, scrivi due virgolette doppie.)" ... Ci sono anche alcune restrizioni sul caso che potresti voler esaminare.
Quindi, se hai intenzione di citare i tuoi identificatori, puoi usare qualsiasi carattere tu voglia (ad eccezione di \ 0). Ma se non stai citando i tuoi identificatori, devi seguire le regole descritte in quella pagina.
Volevo evidenziarlo principalmente perché mi ha morso prima, in particolare le regole relative al caso negli identificatori non quotati (e i nomi degli schemi contano come identificatori).
AGGIORNARE:
Ad esempio (non specificamente applicabile agli identificatori di schemi, ma ugualmente applicabile a loro):
DROP TABLE "tbluser"; -- assuming it exists
DROP TABLE "TBLUSER"; -- assuming it exists; incidentally, they are two different tables
CREATE TABLE "TBLUSER" ( username text );
INSERT INTO "TBLUSER" VALUES ( 'joe' );
SELECT * FROM TBLUSER; -- this returns an error that the tbluser relation does not exist
SELECT * FROM "TBLUSER"; -- works fine
Questo potrebbe essere un comportamento previsto per coloro che hanno esperienza con PostgreSQL (e forse gli standard SQL), ma qualcuno che è nuovo su PG e proveniente dal punto di vista di altri server di database (ad esempio SQL Server o Oracle) potrebbe imbattersi in questo comportamento e mi chiedo perché manchi la tabella che hanno appena creato.
Forse alcuni manuali sconsigliano l'uso di identificatori tra virgolette, ma il fatto è che gli identificativi tra virgolette sono disponibili per l'uso e possono essere usati e inoltre, molti pacchetti lo rendono una politica per usare sempre identificatori tra virgolette durante la creazione e l'accesso a relazioni che non lo sono interamente in minuscolo, ad es. PGAdmin III.
Ad esempio, questo è lo script generato da PGAdmin III durante la creazione di una tabella tramite l'interfaccia utente:
CREATE TABLE public."TBLUSER"
(
username text
)
WITH (
OIDS = FALSE
)
;
Pertanto, l'unico modo in cui un utente può accedere a questa tabella in una query è facendo riferimento al suo identificatore tra virgolette, ovvero "TBLUSER"
. Tentare di accedere a questa tabella in una query con un identificatore non quotato comporterà la mancata individuazione della relazione, ad es TBLUSER
.