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_class
cho 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