188 votes

Échapper aux noms de colonnes de type mot-clé dans Postgres

Si la colonne de la table de Postgres porte le nom de year comment il faut regarder INSERT pour définir la valeur de cette colonne ?

Par exemple : INSERT INTO table (id, name, year) VALUES ( ... ); donne une erreur près de la année mot.

288voto

NPE Points 169956

Il suffit de joindre year entre guillemets pour éviter qu'elle ne soit interprétée comme une mot-clé :

INSERT INTO table (id, name, "year") VALUES ( ... );

De la documentation :

Il existe un deuxième type d'identifiant : l'identifiant délimité ou identificateur cité. Il est formé en enfermant une séquence arbitraire de entre guillemets ("). Un identificateur délimité est toujours un identificateur et jamais un mot clé. Ainsi, "select" pourrait être utilisé pour faire référence à une colonne ou à une table nommée "select", alors qu'un "select" non guillemet serait mot-clé et provoquerait donc une erreur de syntaxe lorsqu'il serait utilisé utilisé là où l'on attend un nom de table ou de colonne.

9voto

Mayur Points 425

Si vous ne fournissez pas de guillemets dans les champs/colonnes, Postgres les mettra en minuscules par défaut. Et Postgres ne vérifiera pas le mot-clé lorsqu'il s'agit du nom de la colonne.

Dans votre cas, je ne pense pas qu'il soit obligatoire d'ajouter des guillemets lorsqu'il s'agit de la columns . Mais si vous utilisez keywords (enregistré par Postgres) comme nom de l'élément Table , Schema , Function o Trigger etc., vous devez utiliser des guillemets doubles, ou vous pouvez spécifier le nom du schéma avec une concaténation de points.

Supposons, commander est le mot-clé enregistré par Postgres. Et dans certains scénarios, vous devez utiliser ce mot-clé comme nom de table.

À ce moment-là, Postgres vous permettra de créer une table avec l'option keywords . C'est la beauté de Postgres.

Pour accéder à la table des commandes, soit vous devez utiliser une double citation, soit vous pouvez utiliser le nom du schéma avant le nom de la table.

E.G.

1.

select * from schema_name.order;

2.

select * from "order";

De même, vous pouvez utiliser ce type de combinaison. J'espère que cela vous aidera.

-4voto

ceving Points 3990

Pour être sûr : Toujours citer les identifiants ! Pour cela, vous devez construire la déclaration d'insertion avec des identifiants délimités.

SQL 2003 spécifie qu'un identifiant délimité doit être cité avec des guillemets doubles " et si un guillemet double apparaît dans l'identifiant, le guillemet double doit être dupliqué. Voir la BNF :

https://ronsavage.github.io/SQL/sql-2003-2.bnf.html#delimited%20identifier

Il s'agit du code Java permettant de citer l'identifiant :

static String delimited_identifier (String identifier)
{
  return "\"" + identifier.replaceAll ("\"", "\"\"") + "\"";
}

Et voici le code pour construire l'insert :

static String build_insert (String table, String[] columns)
{
  StringBuilder sql = new StringBuilder ();
  StringBuilder values = new StringBuilder ();

  sql.append ("INSERT INTO ");
  sql.append (delimited_identifier (table));
  sql.append (" (");
  int c = 0;
  if (columns.length > 0) {
    sql.append (delimited_identifier (columns[c]));
    values.append ("?");
  }
  for (++c; c < columns.length; c++) {
    sql.append (", ");
    sql.append (delimited_identifier (columns[c]));
    values.append (", ?");
  }
  sql.append (") VALUES (");
  sql.append (values.toString ());
  sql.append (")");

  return sql.toString ();
}

Exemple :

String sql = build_insert ("Person", new String[]{"First name", "Last name"});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X