Các định dạng hợp lệ của tên lược đồ PostgreQuery là gì?


12

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?

Câu trả lời:


16

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 ...


Cảm ơn. Tôi sẽ làm theo các hướng dẫn này và xem nếu đó là các tên lược đồ hợp lệ. Nếu vậy, thì tôi sẽ chấp nhận điều này.

Có thể muốn thêm pg_dấu gạch dưới vào liên kết đó, như Nathan C đã đề cập .
Ramon Tayag

5

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.


Cảm ơn tôi sẽ thêm nó vào danh sách các lược đồ không thể được đặt tên. Thật không may, rõ ràng đó không phải là quy tắc duy nhất. Tôi có thể đặt tên cho nó this-is schemavà nó vẫn sẽ là một tên lược đồ không hợp lệ.

3
@Ramon: cái này là hoặc cái này là lược đồ hợp lệ, nói đúng ra. Bạn dường như khó hiểu những gì có giá trị với khi nó phải được trích dẫn .
Daniel Vérité

Có bạn có lẽ đúng. Hãy để tôi xem xét điều này.
Ramon Tayag

3

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.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9
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.