Tidak dapat membuat tabel database dengan nama 'user' di PostgreSQL

94

Tampaknya PostgreSQL tidak mengizinkan untuk membuat tabel database bernama 'user'. Tetapi MySQL akan memungkinkan untuk membuat tabel seperti itu.

Apakah karena itu kata kuncinya? Tetapi Hibernate tidak dapat mengidentifikasi masalah apa pun (bahkan jika kami mengatur PostgreSQLDialect).

Channa
sumber
2
Ya, pengguna adalah kata kunci yang dipesan. Jangan gunakan itu sebagai nama tabel. postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet
Anda dapat membuat tabel bernama 'user' di postgreSQL. Tetapi saya menyarankan Anda untuk menghindari penggunaan tabel / kolom / variabel ... nama menggunakan kata kunci token
Houari
Maaf ini bukan pertanyaan duplikat. Pertanyaannya adalah tentang postgresql bukan tentang sesuatu dengan MySql. Terima kasih.
Channa

Jawaban:

145

user adalah kata yang dicadangkan dan biasanya bukan ide yang baik menggunakan kata yang dicadangkan untuk pengenal (tabel, kolom).

Jika Anda bersikeras melakukan itu, Anda harus memberi nama tabel dalam tanda kutip ganda:

create table "user" (...);

Tapi kemudian Anda selalu perlu menggunakan tanda kutip ganda saat mereferensikan tabel. Selain itu, nama tabel peka huruf besar-kecil. "user"adalah nama tabel yang berbeda dari "User".

Jika Anda ingin menyelamatkan diri dari banyak masalah gunakan nama yang berbeda. users,, user_account...

Rincian lebih lanjut tentang pengenal yang dikutip dapat ditemukan di manual: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

seekor kuda tanpa nama
sumber
Sayangnya ini bukan jawaban dalam proyek berbasis Hibernate, seperti yang disebutkan topicstarter =) Masalah sebenarnya di sini adalah kegagalan Hibernate untuk melakukan pelarian semacam itu secara otomatis. Meskipun diberi tahu dialek yang tepat! Jadi jawaban yang tepat harus menjelaskan cara membuat pekerjaan di Hibernate, bukan di PSQL :(
Maksim Gumerov
3
@MaksimGumerov: jawaban yang tepat adalah: jangan gunakan nama yang membutuhkan tanda kutip - terlepas dari lapisan obfuscation yang Anda gunakan.
a_horse_with_no_name
Bukan itu bukan satu-satunya :) Anda akan berakhir dengan mengikat kode Anda ke database tertentu dan kata kuncinya (dan set ini dapat berubah). Salah satu solusi sebenarnya adalah mengaktifkan melarikan diri secara global (meskipun tidak mencobanya sendiri), yang lain bergantung pada penganalisis dialek Hibernate (tetapi seperti yang kita lihat, mereka tidak selalu melakukan tugasnya dalam menentukan apakah kita perlu melarikan diri dari sesuatu).
Maksim Gumerov
@MaksimGumerov intinya adalah Anda tidak dapat membuat tabel bernama pengguna karena dicadangkan oleh database.
IamDOM
Tentu saya bisa - menggunakan kutipan, salah satunya. Mungkin sebaiknya tidak, tetapi itu pun masih bisa diperdebatkan. Yang lebih penting adalah BAGAIMANA cara membuat tabel seperti itu, dan solusi yang diusulkan di sini (satu dengan kutipan) tidak akan membantu dalam proyek Hibernate. Dan pertanyaan awal menyebutkan Hibernate, jadi jawaban IMO sebenarnya tidak cukup baik.
Maksim Gumerov
18

Dimungkinkan untuk menentukan nama tab dengan JPA dengan sintaks berikutnya:

@Table(name="\"user\"")
mnv
sumber
Itu memecahkan masalah saya. Tanpa itu saya mendapatkan kesalahan seperticolumn user0_.id does not exist
James Freitas
7

Kami mengalami masalah yang sama beberapa waktu lalu, dan kami baru saja mengubah nama tabel dari usermenjadi app_user. Karena penggunaan Hibernate / JPA. Kami pikir akan lebih mudah seperti ini. Semoga perbaikan kecil ini akan membantu orang lain.

Sergio A.
sumber
Melakukan hal yang sama.
Stefan Falk
1

Seseorang dapat membuat tabel userdalam skema selain public. Contoh:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
AlexElin
sumber