PostgreSQLで「user」という名前のデータベーステーブルを作成できません


94

PostgreSQLでは「user」という名前のデータベーステーブルを作成できないようです。しかし、MySQLはそのようなテーブルを作成することを許可します。

それはキーワードだからですか?ただし、Hibernateは問題を特定できません(PostgreSQLDialectを設定した場合でも)。


2
はい、ユーザーは予約済みのキーワードです。テーブル名として使用しないでください。postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet 2014年

postgreSQLで「user」という名前のテーブルを作成できます。ただし、テーブル/列/変数の使用は避けることをお勧めします...トークンキーワードを使用した名前
Houari 2014年

申し訳ありませんが、これは重複した質問ではありません。質問はpostgresqlに関するものであり、MySqlに関するものではありません。ありがとう。
チャンナ

回答:


144

user は予約語であり、識別子(テーブル、列)に予約語を使用することは通常はお勧めできません。

そうすることを主張する場合は、テーブル名を二重引用符で囲む必要があります。

create table "user" (...);

ただし、テーブルを参照するときは、常に二重引用符を使用する必要があります。さらに、テーブル名では大文字と小文字が区別されます。"user"はとは異なるテーブル名です"User"

多くの手間を省きたい場合は、別の名前を使用してください。usersuser_account、...

引用された識別子の詳細については、マニュアルを参照してくださいhttp//www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


残念ながら、topicstarterが述べたように、これはHibernateベースのプロジェクトでは答えではありません=)ここでの実際の問題は、Hibernateがその種のエスケープを自動的に実行できないことです。適切な方言を言われているにも関わらず!したがって、適切な答えは、PSQLではなくHibernateで作業を行う方法を説明する必要があります:(
Maksim Gumerov 2018年

3
@MaksimGumerov:正しい答えは次のとおりです。使用している難読化レイヤーに関係なく、引用符で囲まれた識別子を必要とする名前は使用しないでください。
a_horse_with_no_name 2018年

いいえ、そうではありません:)コードを特定のデータベースとそのキーワードに結び付けることになります(このセットは変更される可能性があります)。実際の解決策の1つは、グローバルにエスケープをオンにすることです(ただし、自分で試してみませんでした)。もう1つは、Hibernate方言アナライザーに依存することです(ただし、ご覧のとおり、何かをエスケープする必要があるかどうかを判断するのに常に役立つとは限りません)。
Maksim Gumerov 2018年

@MaksimGumerovのポイントは、userという名前のテーブルはデータベースによって予約されているため、作成できないということです。
iamDOM

確かに私はできます-引用符を使用します。多分私はすべきではありませんが、それでも議論の余地があります。さらに重要なのは、そのようなテーブルをどのように作成するかです。ここで提案されているソリューション(引用付きのもの)は、Hibernateプロジェクトでは役に立ちません。そして、最初の質問はHibernateに言及しているので、答えは実際にはIMOに十分に答えていません。
Maksim Gumerov

18

次の構文でJPAを使用してテーブル名を指定することができます。

@Table(name="\"user\"")

それで私の問題は解決しました。それがないと、次のようなエラーが発生していましたcolumn user0_.id does not exist
James Freitas

7

同じ問題が以前に発生し、テーブル名をからuserに変更しましたapp_user。Hibernate / JPAを使用しているため。この方が簡単だと思いました。この小さな修正が他の誰かに役立つことを願っています。


同じことをしました。
ステファンフォーク

1

user以外のスキーマにテーブルを作成できますpublic。例:

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