Postgresでキーワードのような列名をエスケープする


134

Postgresのテーブルの列の名前がyearINSERTある場合、その列の値を設定するにはどのようにクエリを検索すればよいですか?

例:年の単語にINSERT INTO table (id, name, year) VALUES ( ... );近いエラーを出します。

回答:


211

キーワードyearとして解釈されないようにするには、単に二重引用符で囲みます。

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

ドキュメントから:

2つ目の種類の識別子があります。区切り識別子または引用識別子です。これは、文字の任意のシーケンスを二重引用符( ")で囲むことによって形成されます。区切り識別子は常に識別子であり、キーワードではありません。したがって、「select」は、「select」という名前の列またはテーブルを参照するために使用できます。一方、引用符で囲まれていないselectはキーワードとして扱われるため、テーブル名または列名が予想される場所で使用すると、解析エラーが発生します。


44
いくつかの警告:引用符がないと、PostgreSQLはすべての識別子を小文字に変換します。MyTablemyTableおよびmytableまったく同じです。引用符この折り畳みが行われていません。したがって、と同じではありません。"MyTable"mytable
AH

19
さらに良いことに、識別子として予約語または大/小文字混合を使用しないでください。二重引用符を使用したり、奇妙なエラーメッセージを受け取ったりする必要はありません。
Erwin Brandstetter、2011年


8
@ErwinBrandstetter問題は、確立されたプロジェクトに取り組むときです。
セルルール

5
@HoàngLongはいそうです。update "user" set "password" = 'value...';完全に正常に動作します...
Phill

0

フィールド/列に引用符を付けない場合、デフォルトでPostgresによって小文字に変換されます。そして、Postgresは列名に関してはキーワードのチェックをスキップします。

あなたの場合、に関しては引用符を追加する必要はないと思いますcolumns。あなたが使用している場合でも、keywordsの名前として(Postgresではにより登録)TableSchemaFunctionまたはTriggerなど、あなたはどちらか、二重引用符を使用している必要があります、またはあなたは、ドット連結でスキーマ名を指定することができます。

仮に、orderがPostgresによって登録されたキーワードであるとしましょう。一部のシナリオでは、このキーワードをテーブル名として使用する必要があります。

その時、Postgresはでテーブルを作成できるようにしますkeywords。それがPostgresの魅力です。

注文テーブルにアクセスするには、二重引用符を使用するか、テーブル名の前にスキーマ名を付けることができます。

例えば

1。

select * from schema_name.order;

2。

select * from "order";

同様に、このタイプの組み合わせを使用できます。これがお役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.