ไม่สามารถสร้างตารางฐานข้อมูลชื่อ 'ผู้ใช้' ใน PostgreSQL


94

ดูเหมือนว่า PostgreSQL ไม่อนุญาตให้สร้างตารางฐานข้อมูลชื่อ 'ผู้ใช้' แต่ MySQL จะอนุญาตให้สร้างตารางดังกล่าว

นั่นเป็นเพราะมันเป็นคำสำคัญ? แต่ Hibernate ไม่สามารถระบุปัญหาใด ๆ (แม้ว่าเราจะตั้งค่า PostgreSQLDialect)


2
ใช่ผู้ใช้คือคีย์เวิร์ดที่สงวนไว้ แค่อย่าใช้เป็นชื่อตาราง postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet

คุณสามารถสร้างตารางชื่อ 'ผู้ใช้' บน postgreSQL แต่ฉันแนะนำให้คุณหลีกเลี่ยงการใช้ตาราง / คอลัมน์ / ตัวแปร ... ชื่อที่ใช้คำหลักโทเค็น
Houari

ขออภัยนี่ไม่ใช่คำถามที่ซ้ำกัน คำถามเกี่ยวกับ postgresql ไม่เกี่ยวกับบางสิ่งกับ MySql ขอบคุณ.
Channa

คำตอบ:


145

user เป็นคำสงวนและโดยปกติไม่ควรใช้คำสงวนสำหรับตัวระบุ (ตารางคอลัมน์)

หากคุณยืนยันที่จะทำคุณต้องใส่ชื่อตารางในเครื่องหมายคำพูดคู่:

create table "user" (...);

แต่แล้วคุณมักจะต้องใช้คำพูดสองเมื่ออ้างอิงโต๊ะ นอกจากนี้ชื่อตารางจะคำนึงถึงขนาดตัวพิมพ์ เป็นชื่อตารางที่แตกต่างกว่า"user""User"

หากคุณต้องการช่วยตัวเองให้รอดพ้นจากปัญหาให้ใช้ชื่ออื่น users,, user_account...

สามารถอ่านรายละเอียดเพิ่มเติมเกี่ยวกับตัวระบุที่ยกมาได้ในคู่มือ: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


น่าเสียดายที่นี่ไม่ใช่คำตอบในโครงการที่ใช้ไฮเบอร์เนตตามที่ topicstarter กล่าวถึง =) ปัญหาที่เกิดขึ้นจริงที่นี่คือความล้มเหลวของ Hibernate ในการหลบหนีโดยอัตโนมัติ ทั้งๆที่บอกภาษาถิ่นถูก! ดังนั้นคำตอบที่ถูกต้องควรพูดถึงวิธีการทำงานใน Hibernate ไม่ใช่ใน PSQL :(
Maksim Gumerov

3
@MaksimGumerov: คำตอบที่ถูกต้องคือ: อย่าใช้ชื่อที่ต้องใช้ตัวระบุที่ยกมา - ไม่ว่าคุณจะใช้เลเยอร์ที่ทำให้สับสน
a_horse_with_no_name

ไม่ใช่นั่นไม่ใช่ :) คุณจะต้องผูกรหัสของคุณกับฐานข้อมูลเฉพาะและคำหลัก (และชุดนี้อาจมีการเปลี่ยนแปลง) วิธีแก้ปัญหาที่แท้จริงอย่างหนึ่งคือการเปิดใช้การหลบหนีทั่วโลก (ไม่ได้ลองด้วยตัวเอง) อีกวิธีหนึ่งใช้เครื่องวิเคราะห์ภาษาไฮเบอร์เนต (แต่อย่างที่เราเห็นพวกเขาไม่ได้ทำงานในการพิจารณาว่าเราจำเป็นต้องหลีกหนีบางสิ่งเสมอไปหรือไม่)
Maksim Gumerov

@MaksimGumerov ประเด็นคือคุณไม่สามารถสร้างตารางชื่อผู้ใช้เนื่องจากถูกสงวนไว้โดยฐานข้อมูล
IamDOM

แน่นอนว่าฉันทำได้ - โดยใช้เครื่องหมายคำพูดสำหรับหนึ่ง บางทีฉันไม่ควร แต่ก็เป็นที่ถกเถียงกันอยู่ สิ่งที่สำคัญกว่าคือฉันจะสร้างตารางดังกล่าวได้อย่างไรและโซลูชันที่เสนอที่นี่ (หนึ่งที่มีใบเสนอราคา) จะไม่ช่วยในโครงการไฮเบอร์เนต และคำถามเริ่มต้นกล่าวถึง Hibernate ดังนั้นคำตอบจึงไม่ตอบโจทย์ IMO ได้ดีพอ
Maksim Gumerov

18

เป็นไปได้ที่จะระบุชื่อตารางด้วย JPA ด้วยไวยากรณ์ถัดไป:

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

นั่นช่วยแก้ปัญหาของฉันได้ โดยที่ฉันไม่ได้รับข้อผิดพลาดเช่นcolumn user0_.id does not exist
James Freitas

7

เรามีเวลานี้ปัญหาเดียวกันที่ผ่านมาและเราก็เปลี่ยนชื่อตารางจากการuser app_userเนื่องจากการใช้ Hibernate / JPA. เราคิดว่ามันจะง่ายกว่าด้วยวิธีนี้ หวังว่าการแก้ไขเล็กน้อยนี้จะช่วยคนอื่นได้


ทำสิ่งเดียวกัน
Stefan Falk

1

หนึ่งสามารถสร้างตารางในสคีอื่นที่ไม่ใช่user publicตัวอย่าง:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.