PostgreSQL'de 'user' adlı bir veritabanı tablosu oluşturulamaz


94

Görünüşe göre PostgreSQL, 'user' adında bir veritabanı tablosu oluşturmaya izin vermiyor. Ancak MySQL böyle bir tablo oluşturmaya izin verecektir.

Anahtar kelime olduğu için mi? Ancak Hibernate herhangi bir sorunu belirleyemez (PostgreSQLDialect'i ayarlasak bile).


2
Evet, kullanıcı ayrılmış bir anahtar kelimedir. Bunu bir tablo adı olarak kullanmayın. postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet

PostgreSQL'de 'user' adlı bir tablo oluşturabilirsiniz. Ancak tablo / sütun / değişkenler kullanmaktan kaçınmanızı tavsiye ederim ... simge anahtar kelimeleri kullanan isimler
Houari

Maalesef, bu yinelenen bir soru değil. Soru postgresql ile ilgili, MySql ile ilgili bir şey değil. Teşekkürler.
Channa

Yanıtlar:


145

user ayrılmış bir kelimedir ve genellikle tanımlayıcılar için ayrılmış kelimeleri (tablolar, sütunlar) kullanmak iyi bir fikir değildir.

Bunu yapmakta ısrar ediyorsanız, tablo adını çift tırnak içine almanız gerekir:

create table "user" (...);

Ancak tabloya atıfta bulunurken her zaman çift ​​tırnak kullanmanız gerekir. Ek olarak tablo adı büyük / küçük harfe duyarlıdır. "user"öğesinden farklı bir tablo adıdır "User".

Kendinizi çok fazla zahmetten kurtarmak istiyorsanız, farklı bir isim kullanın. users, user_account, ...

Alıntılanan tanımlayıcılar hakkında daha fazla ayrıntı kılavuzda bulunabilir: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


Maalesef bu, Hazırda Bekletme tabanlı bir projede bir cevap değil, konu başlatıcıda belirtildiği gibi =) Buradaki asıl sorun, Hibernate'in bu türden otomatik olarak kaçmayı yapamamasıdır. Doğru lehçe söylenmesine rağmen! Öyleyse doğru cevap,
PSQL'de

3
@MaksimGumerov: Doğru cevap: Kullandığınız şaşırtma katmanı ne olursa olsun, alıntılanmış tanımlayıcılar gerektiren isimler kullanmayın.
a_horse_with_no_name

Hayır, bu değil :) Kodunuzu belirli bir veritabanına ve anahtar kelimelerine bağlayacaksınız (ve bu set değişikliklere tabidir). Gerçek bir çözüm küresel olarak kaçmaktır (yine de kendim denemedim), diğeri ise Hazırda bekletme lehçesi analizörlerine güveniyor (ama gördüğümüz gibi, bir şeyden kaçmamız gerekip gerekmediğini belirlemek için her zaman işlerini yapmıyorlar).
Maksim Gumerov

@MaksimGumerov asıl mesele, user isimli tabloyu veritabanı tarafından rezerve edildiği için oluşturamamanızdır.
IamDOM

Elbette yapabilirim - birincisi, tırnak işareti kullanarak. Belki yapmamalıyım ama bu bile tartışılabilir. Daha da önemlisi, böyle bir tabloyu NASIL oluşturabilirim ve burada önerilen çözüm (teklifli) Hazırda Bekletme projelerinde yardımcı olmayacaktır. Ve ilk soru Hibernate'den bahsediyor, bu yüzden cevap aslında yeterince iyi cevap vermiyor IMO.
Maksim Gumerov

18

Bir sonraki sözdizimi ile JPA ile tablo adı belirtmek mümkündür:

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

Bu benim sorunumu çözdü. O olmadan şu hatalar alıyordumcolumn user0_.id does not exist
James Freitas

7

Aynı sorunu daha önce yaşadık ve tablo adını olarak userdeğiştirdik app_user. Hibernate / JPA kullanımı nedeniyle. Bu şekilde daha kolay olacağını düşündük. Umarım bu küçük düzeltme başka birine yardımcı olur.


Aynı şeyi yaptı.
Stefan Falk

1

userŞemada dışında tablo oluşturulabilir public. Örnek:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.