Tôi dường như không thể tìm thấy tài liệu mô tả các định dạng hợp lệ của tên lược đồ PostgreSQL. Tôi biết rằng một tên lược đồ không thể:
- bắt đầu bằng một con số
- có không gian
- bắt đầu với
pg_
Còn gì nữa không Tôi nên tìm ở đâu?
Tôi dường như không thể tìm thấy tài liệu mô tả các định dạng hợp lệ của tên lược đồ PostgreSQL. Tôi biết rằng một tên lược đồ không thể:
pg_
Còn gì nữa không Tôi nên tìm ở đâu?
Câu trả lời:
Theo tài liệu tốt , tôi nghĩ rằng đây có thể là những gì bạn đang tìm kiếm.
Các định danh SQL và các từ khóa phải bắt đầu bằng một chữ cái (az, nhưng cũng là các chữ cái có dấu phụ và các chữ cái không phải là chữ Latinh) hoặc dấu gạch dưới (_). Các ký tự tiếp theo trong mã định danh hoặc từ khóa có thể là chữ cái, dấu gạch dưới, chữ số (0-9) hoặc ký hiệu đô la ($). Lưu ý rằng ký hiệu đô la không được phép trong các mã định danh theo chữ cái của tiêu chuẩn SQL, vì vậy việc sử dụng chúng có thể khiến các ứng dụng ít di động hơn ...
pg_
dấu gạch dưới vào liên kết đó, như Nathan C đã đề cập .
Theo tài liệu , nó cũng không thể bắt đầu pg_
vì nó được bảo lưu. Khác hơn là nó trông khá tự do.
this-is schema
và nó vẫn sẽ là một tên lược đồ không hợp lệ.
Câu trả lời đúng là câu được cung cấp bởi gsiems. Tuy nhiên, tôi muốn chỉ ra rằng PostgreSQL có các quy tắc về các định danh được trích dẫn mà bạn có thể ghi nhớ. "Số nhận dạng được trích dẫn có thể chứa bất kỳ ký tự nào, ngoại trừ ký tự có mã số 0. (Để bao gồm một trích dẫn kép, hãy viết hai dấu ngoặc kép." "... Cũng có một số hạn chế về trường hợp bạn có thể muốn xem xét.
Vì vậy, nếu bạn định trích dẫn số nhận dạng của mình, thì bạn có thể sử dụng bất kỳ ký tự nào bạn muốn (ngoại trừ \ 0). Nhưng nếu bạn không trích dẫn số nhận dạng của mình, bạn phải tuân theo các quy tắc được nêu trên trang đó.
Tôi muốn chỉ ra điều này chủ yếu bởi vì nó đã cắn tôi trước đây, đặc biệt là các quy tắc liên quan đến trường hợp trong các định danh không được trích dẫn (và tên lược đồ được tính là định danh).
CẬP NHẬT:
Như một ví dụ (không áp dụng cụ thể cho các định danh lược đồ, nhưng áp dụng tương tự cho chúng):
DROP TABLE "tbluser"; -- assuming it exists
DROP TABLE "TBLUSER"; -- assuming it exists; incidentally, they are two different tables
CREATE TABLE "TBLUSER" ( username text );
INSERT INTO "TBLUSER" VALUES ( 'joe' );
SELECT * FROM TBLUSER; -- this returns an error that the tbluser relation does not exist
SELECT * FROM "TBLUSER"; -- works fine
Đây có thể là hành vi được mong đợi đối với những người có kinh nghiệm với PostgreSQL (và có lẽ là các tiêu chuẩn SQL), nhưng ai đó mới biết về PG và đến từ quan điểm của các máy chủ cơ sở dữ liệu khác (ví dụ: SQL Server hoặc Oracle) có thể gặp phải hành vi này và tự hỏi tại sao cái bàn họ vừa tạo bị thiếu
Có lẽ một số hướng dẫn khuyên bạn không nên sử dụng số nhận dạng được trích dẫn, nhưng thực tế của vấn đề là số nhận dạng được trích dẫn có sẵn để sử dụng và có thể được sử dụng và hơn nữa, nhiều gói làm cho chính sách luôn sử dụng số nhận dạng được trích dẫn khi tạo và truy cập các quan hệ không chữ thường hoàn toàn, ví dụ: PGAdmin III.
Ví dụ: đây là tập lệnh được tạo bởi PGAdmin III khi tạo bảng thông qua UI:
CREATE TABLE public."TBLUSER"
(
username text
)
WITH (
OIDS = FALSE
)
;
Do đó, cách duy nhất mà người dùng có thể truy cập vào bảng này trong truy vấn là bằng cách tham khảo mã định danh được trích dẫn của nó, nghĩa là , "TBLUSER"
. Cố gắng truy cập bảng này trong một truy vấn với mã định danh không được trích dẫn sẽ dẫn đến việc không xác định được mối quan hệ, nghĩa là , TBLUSER
.