PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Regclass nghĩa là gì trong Postgresql

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cơ sở dữ liệu Zend ID cuối cùng của hàng được chèn. (Sử dụng postgres)

  2. Tìm kiếm một mảng JSON cho một đối tượng có chứa giá trị khớp với một mẫu

  3. Bạn có thể tạo chỉ mục trong định nghĩa TẠO BẢNG không?

  4. PostgreSQL Streaming Replication so với Logical Replication

  5. Không thể gọi 11 Thủ tục được lưu trữ của PostgreSQL với Hibernate