Escape-Schlüsselwort-ähnliche Spaltennamen in Postgres

134

Wenn die Spalte in der Tabelle von Postgres den Namen hat year, wie sollte die INSERTAbfrage aussehen , um den Wert für diese Spalte festzulegen?

ZB: INSERT INTO table (id, name, year) VALUES ( ... );gibt einen Fehler in der Nähe des Jahres Wort.

Shybovycha
quelle

Antworten:

210

Schließen Sie einfach yeardoppelte Anführungszeichen an, um zu verhindern, dass es als Schlüsselwort interpretiert wird :

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

Aus der Dokumentation :

Es gibt eine zweite Art von Kennung: die begrenzte Kennung oder die zitierte Kennung. Es wird gebildet, indem eine beliebige Folge von Zeichen in doppelte Anführungszeichen (") eingeschlossen wird. Ein durch Trennzeichen getrennter Bezeichner ist immer ein Bezeichner, niemals ein Schlüsselwort." Select "kann also verwendet werden, um auf eine Spalte oder Tabelle mit dem Namen" select "zu verweisen. Eine nicht in Anführungszeichen gesetzte Auswahl würde als Schlüsselwort verwendet und würde daher einen Analysefehler hervorrufen, wenn sie verwendet wird, wenn ein Tabellen- oder Spaltenname erwartet wird.

NPE
quelle
44
Einige Warnung: Ohne die Anführungszeichen faltet PostgreSQL alle Bezeichner in Kleinbuchstaben. MyTable, myTableUnd mytableist genau das gleiche. Mit den Anführungszeichen wird diese Faltung nicht durchgeführt. Also "MyTable"ist nicht mehr dasselbe wie mytable.
AH
19
Besser noch, vermeiden Sie es, reservierte Wörter oder Groß- und Kleinschreibung als Bezeichner zu verwenden, und Sie müssen niemals doppelte Anführungszeichen verwenden oder seltsame Fehlermeldungen erhalten.
Erwin Brandstetter
8
@ErwinBrandstetter Problem ist, wenn Sie an einem etablierten Projekt arbeiten.
Ceruleus
5
@ HoàngLong ja das tut es. update "user" set "password" = 'value...';funktioniert einwandfrei ...
Phill
0

Wenn Sie in keinen Feldern / Spalten Anführungszeichen angeben, wird diese standardmäßig von Postgres in Kleinbuchstaben geschrieben. Und Postgres überspringt die Überprüfung des Schlüsselworts, wenn es um den Spaltennamen geht.

In Ihrem Fall denke ich nicht, dass es obligatorisch ist, Anführungszeichen hinzuzufügen, wenn es um das geht columns. Aber wenn Sie verwenden keywords( wird von Postgres) als der Name Table, Schema, Functionoder Triggeretc, müssen Sie entweder doppelte Anführungszeichen verwenden müssen, oder Sie können Schemanamen mit Punkt Verkettung angeben.

Angenommen, order ist das von Postgres registrierte Schlüsselwort. In einigen Szenarien müssen Sie dieses Schlüsselwort als Tabellennamen verwenden.

Zu diesem Zeitpunkt können Sie mit Postgres eine Tabelle mit erstellen keywords. Das ist das Schöne an Postgres.

Um auf die Auftragstabelle zuzugreifen, müssen Sie entweder ein doppeltes Anführungszeichen verwenden oder Sie können den Schemanamen vor dem Tabellennamen eingeben.

Z.B

1.

select * from schema_name.order;

2.

select * from "order";

Ebenso können Sie diese Art der Kombination verwenden. Hoffe das wird dir helfen.

Mayur
quelle