Dưới đây là năm cách để kiểm tra xem một bảng có tồn tại trong cơ sở dữ liệu PostgreSQL hay không.
pg_tables
Xem
pg_tables
dạng xem chứa thông tin về mỗi bảng trong cơ sở dữ liệu.
Chúng tôi có thể sử dụng nó để kiểm tra xem một bảng nhất định có tồn tại trong cơ sở dữ liệu hiện tại hay không:
SELECT EXISTS (
SELECT FROM
pg_tables
WHERE
schemaname = 'public' AND
tablename = 'actor'
);
Kết quả:
True
Trong trường hợp này, tôi nhận được True
, có nghĩa là bảng tồn tại (và tôi có quyền truy cập vào nó).
Tùy thuộc vào cấu hình của bạn, bạn có thể nhận được t
/ f
thay vì True
/ False
.
information_schema.tables
Xem
information_schema.tables
dạng xem chứa tất cả các bảng và dạng xem được xác định trong cơ sở dữ liệu hiện tại mà người dùng hiện tại có quyền truy cập.
Chúng tôi có thể sử dụng nó để kiểm tra xem một bảng nhất định có tồn tại hay không và chúng tôi có quyền truy cập vào nó hay không:
SELECT EXISTS (
SELECT FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor'
);
Kết quả:
True
Một cách khác để làm điều đó là đếm:
SELECT
COUNT(table_name)
FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor';
Kết quả:
1
table_type
có thể là một trong những điều sau:
BASE TABLE | Bảng cơ sở liên tục (bảng bình thường) |
VIEW | Xem |
FOREIGN | Bảng ngoại |
LOCAL TEMPORARY | Bảng tạm thời |
Bạn có thể bỏ qua table_type
từ bộ lọc của bạn nếu bạn muốn kiểm tra xem tên có tồn tại trên tất cả các loại hay không.
Danh mục hệ thống
Danh mục hệ thống là nơi RDBMS lưu trữ siêu dữ liệu lược đồ, chẳng hạn như thông tin về các bảng và cột cũng như thông tin kế toán nội bộ.
Trong Postgres, danh mục hệ thống là các bảng thông thường.
Chúng tôi có thể sử dụng hai trong số chúng để kiểm tra xem một bảng nhất định 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 = 'public' AND
c.relname = 'actor' AND
c.relkind = 'r'
);
Kết quả:
True
relkind
trong tổng số r
dành cho bảng thông thường .
Bạn có thể xóa relkind
lọc hoàn toàn nếu bạn chỉ muốn kiểm tra xem một đối tượng đã có tên mà bạn muốn đặt cho bảng hay chưa.
Hoặc bạn có thể lọc theo các loại khác.
Dưới đây là các tùy chọn:
r | bảng thông thường |
i | chỉ mục |
S | trình tự |
t | bảng TOAST |
v | lượt xem |
m | chế độ xem cụ thể hóa |
c | loại kết hợp |
f | bảng ngoại |
p | bảng được phân vùng |
I | chỉ mục được phân vùng |
to_regclass()
Chức năng
to_regclass()
hàm dịch tên quan hệ dạng văn bản sang OID của nó. Nếu tên tồn tại, OID sẽ được trả về.
Ví dụ:
SELECT to_regclass('public.actor');
Kết quả:
actor
Nếu bảng không tồn tại, NULL được trả về.
Truyền tới regclass
Cũng có thể truyền tên bảng để nhập regclass
:
SELECT 'public.actor'::regclass
Kết quả:
actor
Tuy nhiên, nếu bảng không tồn tại, thì sẽ xảy ra lỗi.
Kiểm tra xem một bảng đã tồn tại chưa trước khi tạo nó
Nếu bạn cần tạo bảng nếu nó không tồn tại, bạn có thể sử dụng IF NOT EXISTS
mệnh đề của CREATE TABLE
tuyên bố. Nếu bảng không tồn tại, nó sẽ được tạo. Nếu nó đã tồn tại, nó sẽ không được tạo.
Hãy xem Chỉ tạo bảng nếu nó không tồn tại trong PostgreSQL để làm ví dụ.