0

PostgreSQL: как создать таблицу только если она еще не существует?

8

У меня есть вопрос по работе с PostgreSQL. Как можно задать условие для создания таблицы только в случае, если она еще не существует?

Буду признателен, если приведете пример кода.

5 ответ(ов)

0

Для перевода вашего 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();

Объяснение кода:

  1. Создание функции: Функция update_the_db создаётся с использованием языка plpgsql.
  2. Проверка существования таблицы: Внутри функции выполняется проверка на наличие таблицы с помощью information_schema.tables. Если таблица отсутствует, то создаётся новая таблица your_table_name_here с двумя колонками: the_id (тип int, не может быть null) и name (тип text).
  3. Вызов функции: Функция вызывается с помощью select update_the_db();, что запускает её выполнение.
  4. Удаление функции: В конце происходит удаление функции с помощью drop function update_the_db();.

Не забудьте заменить your_table_name_here на нужное название вашей таблицы.

0

Просто создайте таблицу и не беспокойтесь о том, существует она или нет. Если таблицы не существует, она будет создана; если же она уже существует, изменения в таблице не произойдут. Вы всегда можете проверить возвращаемое значение вашего SQL-запроса, чтобы узнать, существовала ли таблица на момент выполнения оператора создания.

0

Думаю, вам может помочь проверка таблицы pg_class. Например, можно сделать что-то вроде этого:

SELECT COUNT(relname) as a FROM pg_class WHERE relname = 'mytable';

Если a = 0, то создайте таблицу.

С уважением.

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.

0

Лучший ответ был дан 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;
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь