PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Der Tabellen- oder Spaltenname darf nicht mit einer Ziffer beginnen?

Es kommt von den ursprünglichen SQL-Standards, die durch mehrere Umleitungsschichten schließlich zu einem Bezeichner-Start gelangen Block, das ist eines von mehreren Dingen, aber in erster Linie ist es "ein einfacher lateinischer Buchstabe". Es gibt auch andere Dinge, die verwendet werden können, aber wenn Sie alle Details sehen möchten, gehen Sie zu http://en.wikipedia.org/wiki/SQL-92 und folgen Sie den Links zum aktuellen Standard (Seite 85)

Das Vorhandensein von nicht numerischen Kennungseinführern macht das Schreiben eines Parsers zum Dekodieren von SQL für die Ausführung einfacher und schneller, aber eine Form in Anführungszeichen ist auch in Ordnung.

Edit:Warum ist es einfacher für den Parser?

Das Problem für einen Parser liegt eher im SELECT -list-Klausel als FROM Klausel. Die Auswahlliste ist die Liste der Ausdrücke, die aus den Tabellen ausgewählt werden, und dies ist sehr flexibel und ermöglicht einfache Spaltennamen und numerische Ausdrücke. Beachten Sie Folgendes:

SELECT 2e2 + 3.4 FROM ...

Wenn Tabellennamen und Spaltennamen mit Ziffern beginnen könnten, ist 2e2 ein Spaltenname oder eine gültige Nummer (e Format ist normalerweise in numerischen Literalen zulässig) und ist 3.4 die Tabelle "3 " und Spalte "4 " oder ist es der Zahlenwert 3.4 ?

Mit der Regel, dass Bezeichner mit einfachen lateinischen Buchstaben beginnen (und einige andere spezifische Dinge) bedeutet, dass ein Parser 2e2 sieht schnell erkennen, dass dies ein numerischer Ausdruck sein wird, dasselbe gilt für 3.4

Während es möglich wäre, ein Schema zu entwickeln, das numerische führende Zeichen zulässt, könnte dies zu noch undurchsichtigeren Regeln führen (Meinung), daher ist diese Regel eine nette Lösung. Wenn Sie zuerst Ziffern zulassen würden, müssten immer Anführungszeichen gesetzt werden, was wohl nicht so "sauber" ist.

Haftungsausschluss , habe ich das Obige leicht vereinfacht und dabei Korrelationsnamen ignoriert, um es kurz zu halten. Ich bin mit Postgres nicht ganz vertraut, habe aber die obige Antwort anhand der Oracle RDB-Dokumentation und der SQL-Spezifikation überprüft