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

Cách kiểm tra xem một bảng có tồn tại trong một lược đồ nhất định hay không

Nó phụ thuộc vào những gì bạn muốn kiểm tra chính xác .

Lược đồ thông tin?

Để tìm "bảng có tồn tại hay không" ( bất kể ai đang hỏi ), truy vấn lược đồ thông tin (information_schema.tables ) là không chính xác , nói đúng ra, bởi vì (theo tài liệu):

Chỉ những bảng và chế độ xem đó mới được hiển thị rằng người dùng hiện tại có tài khoản (bằng cách là chủ sở hữu hoặc có một số đặc quyền).

Truy vấn do @kong cung cấp có thể trả về FALSE , nhưng bảng vẫn có thể tồn tại. Nó trả lời câu hỏi:

Cách kiểm tra xem bảng (hoặc chế độ xem) có tồn tại hay không và người dùng hiện tại có quyền truy cập vào bảng đó hay không?

SELECT EXISTS (
   SELECT FROM information_schema.tables 
   WHERE  table_schema = 'schema_name'
   AND    table_name   = 'table_name'
   );

Lược đồ thông tin chủ yếu hữu ích để luôn di động trên các phiên bản chính và trên các RDBMS khác nhau. Nhưng việc triển khai chậm, vì Postgres phải sử dụng các chế độ xem phức tạp để tuân thủ tiêu chuẩn (information_schema.tables là một ví dụ khá đơn giản). Và một số thông tin (như OID) bị mất trong bản dịch từ danh mục hệ thống - điều này thực ra mang tất cả thông tin.

Danh mục hệ thống

Câu hỏi của bạn là:

Cách kiểm tra xem bảng có tồn tại hay không?

SELECT EXISTS (
   SELECT FROM pg_catalog.pg_class c
   JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
   WHERE  n.nspname = 'schema_name'
   AND    c.relname = 'table_name'
   AND    c.relkind = 'r'    -- only tables
   );

Sử dụng danh mục hệ thống pg_classpg_namespace trực tiếp, cũng nhanh hơn đáng kể. Tuy nhiên, theo tài liệu trên pg_class :

Danh mục pg_class bảng danh mục và hầu hết mọi thứ khác có cột hoặc tương tự như bảng. Điều này bao gồm chỉ mục (butsee also pg_index ), chuỗi , lượt xem , chế độ xem cụ thể hóa , loại tổng hợp bảng TOAST ;

Đối với câu hỏi cụ thể này, bạn cũng có thể sử dụng chế độ xem hệ thống pg_tables . Đơn giản hơn một chút và dễ di chuyển hơn trên các phiên bản Postgres chính (hầu như không cần quan tâm đến truy vấn cơ bản này):

SELECT EXISTS (
   SELECT FROM pg_tables
   WHERE  schemaname = 'schema_name'
   AND    tablename  = 'table_name'
   );

Số nhận dạng phải là duy nhất trong số tất cả các đối tượng nêu trên. Nếu bạn muốn hỏi:

Cách kiểm tra xem tên của một bảng hoặc đối tượng tương tự trong một lược đồ nhất định có được sử dụng hay không?

SELECT EXISTS (
   SELECT FROM pg_catalog.pg_class c
   JOIN   pg_catalog.pg_namespace n ON n.oid = c.relnamespace
   WHERE  n.nspname = 'schema_name'
   AND    c.relname = 'table_name'
   );
  • Câu trả lời có liên quan trên dba.SE thảo luận về "Lược đồ thông tin so với danh mục hệ thống"

Thay thế:truyền tới regclass

SELECT 'schema_name.table_name'::regclass

Điều này đặt ra một ngoại lệ nếu bảng (tùy chọn đủ điều kiện giản đồ) (hoặc đối tượng khác chiếm tên đó) không tồn tại.

Nếu bạn không đủ điều kiện lược đồ cho tên bảng, một truyền đến regclass mặc định thành search_path và trả về OID cho bảng đầu tiên được tìm thấy - hoặc một ngoại lệ nếu bảng không có trong các lược đồ được liệt kê. Lưu ý rằng các lược đồ hệ thống pg_catalogpg_temp (lược đồ cho các đối tượng tạm thời của phiên hiện tại) tự động là một phần của search_path .

Bạn có thể sử dụng nó và bắt một ngoại lệ có thể có trong một hàm. Ví dụ:

  • Kiểm tra xem trình tự tồn tại trong Postgres (plpgsql)

Truy vấn như trên tránh được các ngoại lệ có thể xảy ra và do đó nhanh hơn một chút.

to_regclass(rel_name) trong Postgres 9.4+

Bây giờ đơn giản hơn nhiều:

SELECT to_regclass('schema_name.table_name');

Giống như dàn diễn viên, nhưng nó trả về ...

... null chứ không phải là thông báo lỗi nếu không tìm thấy tê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. Liệt kê các cột có chỉ mục trong PostgreSQL

  2. Triển khai Django + Python 3 + PostgreSQL lên AWS Elastic Beanstalk

  3. Không thể cài đặt PostgreSQL:Đã xảy ra lỗi khi thực thi trình cài đặt thời gian chạy Microsoft VC ++ trên Windows XP

  4. PostgreSQL Full Text Search và Trigram Confusion

  5. PostgreSQL hàng thành cột