Không, bạn không cần truyền để regclass khi gọi một hàm như nextval chấp nhận một regclass tham số, vì có một lần truyền hoàn toàn từ text thành regclass . Trong một số ngữ cảnh khác, diễn viên rõ ràng đến regclass có thể được yêu cầu.
Giải thích:
::regclass là một tập hợp, như ::integer .
regclass là một kiểu dữ liệu "ma thuật"; nó thực sự là một bí danh cho oid , hoặc "định danh đối tượng". Xem Các loại mã nhận dạng đối tượng
trong tài liệu. Truyền tới regclass là một cách viết tắt để nói "đây là tên của một quan hệ, vui lòng chuyển nó thành oid của quan hệ đó". Truyền tới regclass biết về search_path , không giống như truy vấn pg_class cho oid của một mối quan hệ trực tiếp, do đó, truyền tới phân lớp không chính xác tương đương với truy vấn con pg_class .
Bảng là quan hệ. Trình tự và khung nhìn cũng vậy. Vì vậy, bạn cũng có thể lấy giá trị của một chế độ xem hoặc chuỗi bằng cách truyền để phân loại.
Có các kiểu ẩn được xác định cho text thành regclass , vì vậy nếu bạn bỏ qua kiểu truyền rõ ràng và bạn đang gọi một hàm chấp nhận regclass quá trình diễn viên được thực hiện tự động. Vì vậy, bạn không không cần nó, ví dụ:nextval cuộc gọi.
Có những nơi khác mà bạn có thể. Ví dụ:bạn không thể so sánh text trực tiếp với oid; vì vậy bạn có thể làm điều này:
regress=> select * from pg_class where oid = 'table1'::regclass;
nhưng không phải cái này:
regress=> select * from pg_class where oid = 'table1';
ERROR: invalid input syntax for type oid: "table1"
LINE 1: select * from pg_class where oid = 'table1';
Chỉ cho vui thôi, tôi đã cố gắng viết một truy vấn thực hiện thao tác truyền tương đương tới regclass . Đừng sử dụng nó, nó chủ yếu để giải trí và như một nỗ lực để giới thiệu những gì đang thực sự xảy ra. Trừ khi bạn thực sự quan tâm đến cách thức hoạt động của Pg, bạn có thể dừng đọc ở đây.
Theo tôi hiểu, 'sequence_name'::regclass::oid gần tương đương với truy vấn sau:
WITH sp(sp_ord, sp_schema) AS (
SELECT
generate_series(1, array_length(current_schemas('t'),1)),
unnest(current_schemas('t'))
)
SELECT c.oid
FROM pg_class c INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
INNER JOIN sp ON (n.nspname = sp.sp_schema)
WHERE c.relname = 'sequence_name'
ORDER BY sp.sp_ord
LIMIT 1;
ngoại trừ việc nó ngắn hơn rất nhiều và nhanh hơn rất nhiều. Xem Chức năng thông tin hệ thống
để biết định nghĩa của current_schemas(...) , v.v.
Nói cách khác:
- Nhận một mảng ab liệt kê tất cả các lược đồ mà chúng tôi có quyền truy cập và ghép nối mỗi mục nhập với một số thứ tự cho vị trí của nó trong mảng
- Tìm kiếm
pg_classcho các mối quan hệ với các tên phù hợp và liên kết mỗi tên với không gian tên (lược đồ) của nó - Sắp xếp danh sách các quan hệ còn lại theo thứ tự mà các lược đồ của chúng xuất hiện trong
search_path - và chọn kết quả phù hợp đầu tiên