По-долу са дадени пет начина да проверите дали таблица съществува в PostgreSQL база данни.
pg_tables
Преглед
pg_tables
изгледът съдържа информация за всяка таблица в базата данни.
Можем да го използваме, за да проверим дали дадена таблица съществува в текущата база данни:
SELECT EXISTS (
SELECT FROM
pg_tables
WHERE
schemaname = 'public' AND
tablename = 'actor'
);
Резултат:
True
В този случай получавам True
, което означава, че таблицата съществува (и аз имам достъп до нея).
В зависимост от вашата конфигурация може да получите t
/f
вместо True
/False
.
information_schema.tables
Преглед
information_schema.tables
изгледът съдържа всички таблици и изгледи, дефинирани в текущата база данни, до които текущият потребител има достъп.
Можем да го използваме, за да проверим дали дадена таблица съществува и дали имаме достъп до нея:
SELECT EXISTS (
SELECT FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor'
);
Резултат:
True
Друг начин да го направите е да получите броя:
SELECT
COUNT(table_name)
FROM
information_schema.tables
WHERE
table_schema LIKE 'public' AND
table_type LIKE 'BASE TABLE' AND
table_name = 'actor';
Резултат:
1
table_type
може да бъде едно от следните:
BASE TABLE | Постоянна основна таблица (нормална таблица) |
VIEW | Преглед |
FOREIGN | Чужда таблица |
LOCAL TEMPORARY | Временна таблица |
Можете да пропуснете table_type
от вашия филтър, ако искате да проверите дали името съществува във всички типове.
Системни каталози
Системните каталози са мястото, където RDBMS съхранява метаданни на схемата, като информация за таблици и колони и информация за вътрешно счетоводство.
В Postgres системните каталози са обикновени таблици.
Можем да използваме две от тях, за да проверим дали дадена таблица съществува:
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'
);
Резултат:
True
relkind
на r
е за обикновена маса .
Можете да премахнете relkind
филтрирайте изцяло, ако просто искате да проверите дали даден обект вече има името, което искате да дадете на таблица.
Или можете да филтрирате по други типове.
Ето опциите:
r | обикновена маса |
i | индекс |
S | последователност |
t | Таблица TOAST |
v | преглед |
m | материализиран изглед |
c | съставен тип |
f | чужда таблица |
p | разделена таблица |
I | разделен индекс |
to_regclass()
Функция
to_regclass()
функцията превежда име на текстова връзка в нейния OID. Ако името съществува, OID се връща.
Пример:
SELECT to_regclass('public.actor');
Резултат:
actor
Ако таблицата не съществува, се връща NULL.
Прехвърляне към regclass
Също така е възможно името на таблицата да се прехвърли, за да въведете regclass
:
SELECT 'public.actor'::regclass
Резултат:
actor
Ако обаче таблицата не съществува, възниква грешка.
Проверете дали таблицата вече съществува, преди да я създадете
Ако трябва да създадете таблицата, ако тя не съществува, можете да използвате IF NOT EXISTS
клауза на CREATE TABLE
изявление. Ако таблицата не съществува, тя ще бъде създадена. Ако вече съществува, няма да бъде създаден.
Вижте Създаване на таблица само ако тя не съществува в PostgreSQL за пример.