Không thể tạo bảng cơ sở dữ liệu có tên 'người dùng' trong PostgreSQL


93

Có vẻ như PostgreSQL không cho phép tạo một bảng cơ sở dữ liệu có tên 'người dùng'. Nhưng MySQL sẽ cho phép tạo một bảng như vậy.

Đó là bởi vì nó là một từ khóa? Nhưng Hibernate không thể xác định bất kỳ vấn đề nào (ngay cả khi chúng tôi đặt PostgreSQLDialect).


2
Có, người dùng là một từ khóa dành riêng. Chỉ cần không sử dụng nó làm tên bảng. postgresql.org/docs/9.3/static/sql-keywords-appcharge.html
JB Nizet

Bạn có thể tạo một bảng có tên 'người dùng' trên postgreSQL. Nhưng tôi khuyên bạn nên tránh sử dụng bảng / cột / biến ... tên sử dụng từ khoá thẻ
Houari

Vì vậy, xin lỗi đây không phải là một câu hỏi trùng lặp. Câu hỏi là về postgresql không phải về một số điều với MySql. Cảm ơn.
Channa

Câu trả lời:


143

user là một từ dành riêng và thường không nên sử dụng các từ dành riêng cho số nhận dạng (bảng, cột).

Nếu bạn khăng khăng làm điều đó, bạn phải đặt tên bảng trong dấu ngoặc kép:

create table "user" (...);

Nhưng sau đó bạn luôn cần sử dụng dấu ngoặc kép khi tham chiếu bảng. Ngoài ra, tên bảng sau đó phân biệt chữ hoa chữ thường. "user"là một tên bảng khác với "User".

Nếu bạn muốn tránh cho mình nhiều rắc rối, hãy sử dụng một tên khác. users,, user_account...

Bạn có thể tìm thấy thêm chi tiết về số nhận dạng được trích dẫn trong sách hướng dẫn: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


Thật không may, đây không phải là câu trả lời trong một dự án dựa trên Hibernate, như topicstarter đã đề cập =) Vấn đề thực sự ở đây là Hibernate không thực hiện loại thoát tự động đó. Mặc dù được nói phương ngữ thích hợp! Vì vậy, câu trả lời thích hợp nên nói mô tả làm thế nào để thực hiện trong công việc trong Hibernate, không phải trong psql :(
Maksim Gumerov

3
@MaksimGumerov: câu trả lời thích hợp là: không sử dụng các tên yêu cầu số nhận dạng được trích dẫn - bất kể bạn đang sử dụng lớp obfuscation nào.
a_horse_with_no_name Ngày

Không, đó không phải là một :) Cuối cùng, bạn sẽ buộc mã của mình vào cơ sở dữ liệu cụ thể và các từ khóa của nó (và tập hợp này có thể thay đổi). Một giải pháp thực tế là bật thoát trên toàn cầu (mặc dù tôi không thử), một giải pháp khác là dựa vào máy phân tích phương ngữ Hibernate (nhưng như chúng ta thấy, chúng không phải lúc nào cũng thực hiện công việc của mình trong việc xác định xem chúng ta có cần thoát khỏi thứ gì đó hay không).
Maksim Gumerov

@MaksimGumerov vấn đề là bạn không thể tạo bảng có tên người dùng vì nó được đặt trước bởi cơ sở dữ liệu.
IamDOM

Chắc chắn tôi có thể - sử dụng dấu ngoặc kép, cho một. Có lẽ tôi không nên nhưng ngay cả điều đó cũng có thể tranh cãi. Điều quan trọng hơn là LÀM THẾ NÀO để tôi tạo một bảng như vậy và giải pháp được đề xuất ở đây (một bảng kèm theo báo giá) sẽ không giúp ích gì trong các dự án Hibernate. Và câu hỏi ban đầu đề cập đến Hibernate, vì vậy câu trả lời thực sự không trả lời đủ IMO.
Maksim Gumerov

18

Có thể chỉ định tên bảng bằng JPA với cú pháp tiếp theo:

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

Điều đó đã giải quyết vấn đề của tôi. Nếu không có điều đó, tôi đã nhận được các lỗi nhưcolumn user0_.id does not exist
James Freitas

7

Chúng tôi đã gặp vấn đề tương tự lần trước và chúng tôi vừa thay đổi tên bảng từ userthành app_user. Do sử dụng Hibernate / JPA. Chúng tôi nghĩ rằng nó sẽ dễ dàng hơn theo cách này. Hy vọng sửa chữa nhỏ này sẽ giúp một người khác.


Đã làm điều tương tự.
Stefan Falk

1

Người ta có thể tạo bảng usertrong lược đồ khác với public. Ví dụ:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.