PostgreSQL: как создать таблицу только если она еще не существует?
У меня есть вопрос по работе с PostgreSQL. Как можно задать условие для создания таблицы только в случае, если она еще не существует?
Буду признателен, если приведете пример кода.
5 ответ(ов)
Для перевода вашего SQL-кода на русский язык в стиле ответа на вопрос на StackOverflow, можно использовать следующий текст:
Для создания или замены функции update_the_db
, которая проверяет наличие таблицы и создает её, если она отсутствует, можно использовать следующий код:
create or replace function update_the_db() returns void as
$$
begin
if not exists(select * from information_schema.tables
where
table_catalog = CURRENT_CATALOG and table_schema = CURRENT_SCHEMA
and table_name = 'your_table_name_here') then
create table your_table_name_here
(
the_id int not null,
name text
);
end if;
end;
$$
language 'plpgsql';
select update_the_db();
drop function update_the_db();
Объяснение кода:
- Создание функции: Функция
update_the_db
создаётся с использованием языкаplpgsql
. - Проверка существования таблицы: Внутри функции выполняется проверка на наличие таблицы с помощью
information_schema.tables
. Если таблица отсутствует, то создаётся новая таблицаyour_table_name_here
с двумя колонками:the_id
(тип int, не может быть null) иname
(тип text). - Вызов функции: Функция вызывается с помощью
select update_the_db();
, что запускает её выполнение. - Удаление функции: В конце происходит удаление функции с помощью
drop function update_the_db();
.
Не забудьте заменить your_table_name_here
на нужное название вашей таблицы.
Просто создайте таблицу и не беспокойтесь о том, существует она или нет. Если таблицы не существует, она будет создана; если же она уже существует, изменения в таблице не произойдут. Вы всегда можете проверить возвращаемое значение вашего SQL-запроса, чтобы узнать, существовала ли таблица на момент выполнения оператора создания.
Думаю, вам может помочь проверка таблицы pg_class. Например, можно сделать что-то вроде этого:
SELECT COUNT(relname) as a FROM pg_class WHERE relname = 'mytable';
Если a = 0, то создайте таблицу.
С уважением.
Это старый вопрос, но я решил его поднять, чтобы предложить еще один ответ. Обратите внимание: существуют другие более хорошие ответы, этот приводится исключительно в образовательных целях.
Наиболее простой способ — сделать то, что уже сказали другие: выполнить команду CREATE TABLE, если вы хотите сохранить существующие данные, или выполнить DROP IF EXISTS, а затем CREATE TABLE, если вам нужна новая таблица.
Другой вариант — выполнить запрос к системной таблице, чтобы проверить существование таблицы, и продолжить от этого.
SELECT true FROM pg_tables WHERE tablename = <table> [AND schemaname = <schema>];
Примеры использования:
-- независимый от схемы:
SELECT true FROM pg_tables WHERE tablename = 'foo';
-- зависимый от схемы:
SELECT true FROM pg_tables WHERE tablename = 'foo' AND schemaname = 'bar';
Если запрос вернёт совпадение, вы получите значение true, иначе вернётся пустой набор данных. Вы можете использовать это значение, чтобы определить, нужно ли выполнять CREATE TABLE.
Лучший ответ был дан Skalli, если вы используете PostgreSQL версии 9.1 и выше.
Если, как и я, вам нужно сделать это в PostgreSQL 8.4, вы можете воспользоваться функцией с обработкой исключения 'duplicate_table'.
Это позволит проигнорировать сгенерированную ошибку, когда таблица уже существует, и продолжить обработку других ошибок.
Вот пример, работающий в PostgreSQL 8.4.10:
CREATE FUNCTION create_table() RETURNS VOID AS
$$
BEGIN
CREATE TABLE my_table_name(my_column INT);
EXCEPTION WHEN duplicate_table THEN
-- Ничего не делаем
END;
$$
LANGUAGE plpgsql;
Postgres: Как повысить пользователя до суперпользователя?
Как вставить несколько строк в SQLite?
Решения для INSERT OR UPDATE в SQL Server
Как объединить все массивы целых чисел из всех записей в один массив в PostgreSQL
Выполнение SQL из файла в SQLAlchemy