De Table ou de colonne nom ne peut pas commencer avec le numérique?
J'ai essayé de créer une table nommée 15909434_user
avec la syntaxe comme ci-dessous:
CREATE TABLE 15909434_user ( ... )
Il serait produite l'erreur de parcours. Puis, après que j'ai essayé d'avoir un peu de recherche avec google, j'ai trouvé un bon article ici qui décrivent:
Lorsque vous créez un objet dans PostgreSQL, vous donnez de l'objet par un nom. Chaque table a un nom, chaque colonne a un nom, et ainsi de suite. PostgreSQL utilise un seul type de données pour définir tous les noms d'objet: le
name
type.Une valeur de type
name
est une chaîne de 63 caractères ou moins. Un nom doit commencer par une lettre ou un trait de soulignement; le reste de la chaîne peut contenir des lettres, des chiffres, et des caractères de soulignement....
Si vous trouvez que vous avez besoin de créer un objet qui ne respecte pas ces règles, vous pouvez mettre le nom entre guillemets doubles. L'enveloppant d'un nom entre guillemets crée un identificateur entre guillemets. Par exemple, vous pouvez créer une table dont le nom est "
3.14159
"—les guillemets sont nécessaires, mais ne sont pas réellement une partie du nom (qui est, ils ne sont pas stockées et ne comptent pas dans le 63 caractères maximum). ...
Ok, maintenant je sais comment résoudre ce problème par l'utilisation de cette syntaxe (en mettant des guillemets doubles sur le nom de la table):
CREATE TABLE "15909434_user" ( ... )
Vous pouvez créer la table ou de la colonne comme "15909434_user"
et aussi user_15909434
, mais ne peut pas créer de table ou de colonne le nom commence par numérique sans utiliser de guillemets doubles.
Alors, je suis curieux de connaître la raison derrière cela (sauf que c'est une convention). Pourquoi cette convention? Est-ce pour éviter quelque chose comme de la syntaxe de limitation ou d'une autre raison?
Merci d'avance pour votre attention!
OriginalL'auteur Wayan Wiprayoga | 2013-04-10
Vous devez vous connecter pour publier un commentaire.
Il s'agit de la version d'origine de sql normes, qui par le biais de plusieurs couches d'indirection finalement arriver à un identificateur de commencer bloc, qui est l'un de plusieurs choses, mais c'est avant tout "une simple lettre latine". Il y a d'autres choses aussi qui peuvent être utilisés, mais si vous voulez voir tous les détails, allez à la http://en.wikipedia.org/wiki/SQL-92 et suivez les liens vers le standard actuel ( page 85 )
Non identificateur numérique introducteurs fait d'écrire un analyseur syntaxique pour décoder sql pour l'exécution plus facile et plus rapide, mais une cité la forme est très bien aussi.
Edit: Pourquoi est-il plus facile pour l'analyseur?
Le problème pour un analyseur est plus dans le
SELECT
-liste de la clause de laFROM
clause. La liste de sélection est la liste des expressions qui sont sélectionnés à partir de la tables, et c'est très flexible, permettant simple colonne des noms et des expressions numériques. Considérez les points suivants:Si les noms de table et les noms de colonne pourrait commencer avec des nombres, est
2e2
un nom de colonne ou de numéro valide (e
format est généralement autorisés dans les littéraux numériques) et est3.4
la table "3
" et la colonne "4
" ou est-il de la valeur numérique3.4
?Avoir la règle que identificateurs commencer avec de simples lettres latines (et quelques autres choses spécifiques) signifie qu'un analyseur qui voit
2e2
peut discerner rapidement ce sera une expression numérique, même chose avec la3.4
Alors qu'il serait possible de concevoir un système pour permettre numérique personnages principaux, ce qui pourrait conduire à encore plus de règles obscures (l'opinion), de sorte que cette règle est une solution sympa. Si vous avez autorisé les chiffres d'abord, il aura toujours besoin de le citer, ce qui est sans doute pas aussi "propre".
"123456_name"
ouname_123456
est plus facile et plus rapide que123456_name
?OriginalL'auteur rlb
J'imagine que c'est à voir avec la grammaire.
SELECT 24*DAY_NUMBER as X from MY_TABLE
est bien, mais ambiguë si 24 été accueilli comme un nom de colonne.
L'ajout de guillemets signifie que vous êtes en se référant explicitement à un identificateur n'est pas une constante. Donc pour l'utiliser, vous pensez toujours à s'échapper de toute façon.
SELECT 123abcd
est interprété commeSELECT 123 AS abcd
, c'est à dire même sans un espace de la chaîne après le nombre est considéré comme un alias de colonne.Ok, il a obtenu votre idée. Mais c'est parce que vous incluez l'opérateur de la syntaxe. Comment à propos de l'utilisation non opérateur de la syntaxe comme
SELECT 24_DAY_NUMBER as X FROM MY_TABLE
il doit être non équivoque.pour
SELECT 123abcd
est interprété commeSELECT 123 AS abcd
. Je manque encore le concept de l'ambiguïté dans la syntaxe SQL de l'analyse. PourquoiCREATE TABLE 15909434_user
est ambiguë avecCREATE TABLE user_15909434
. Désolé pour la question stupide.. 😉Forcer les identificateurs de commencer avec un numéro permet à l'analyseur de plus simple et de signaler les erreurs antérieures. La norme spécifie est, donc, PostgreSQL n'est pas vraiment libre de le changer de toute façon. C'est la mise en œuvre du détail; il suffit de le prendre comme étant donné que c'est la façon dont il est, sauf si vous êtes vraiment intéressé dans les entrailles de la descente récursive des analyseurs.
D'accord, je pense que si nous continuons la discussion sur l'analyseur, il serait hors sujet ici. @CraigRinger pourriez-vous répondre à cette question avec votre idée. Ou d'améliorer cette réponse avec l'ajout de votre idée. Je tiens à accepter cette discussion car la réponse.. 🙂
OriginalL'auteur LoztInSpace