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

Как в Postgresql создать условие для создания таблицы, только если она еще не существует?

Пример кода оценен.

Что вы хотите, чтобы произошло, если определение вашей таблицы не соответствует существующему? Ошибка, изменить таблицу, ничего не делать? Некоторый контекст может помочь.

Kev 12.01.2009 17:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
48
1
74 413
10

Ответы 10

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

В большинстве случаев вам действительно не о чем беспокоиться: когда создание происходит внутри транзакции, это приведет к прерыванию транзакции.

diciu 25.08.2011 20:49

Лично я считаю, что такой тип ответа / мышления поощряет плохие практики. Если я ожидал, что таблица может существовать, необходимо проверить это, а не проверить наличие ошибки. Может быть, в 2011 году парадигма работает иначе? Прямо сейчас, когда кто-то пытается создать таблицу, которая уже существует, dbms создает ошибку.

Jeff Maass 14.09.2011 19:41

Я думаю, что проверка таблицы pg_class, возможно, вам поможет, что-то в этом роде:

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

if a = 0 then (CREATE IT)

С Уважением.

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();

Это не принимает во внимание текущую схему, то есть проверяет, существует ли таблица в схеме любой, и не создает ее в текущей, если это так.

BuschnicK 15.11.2010 16:12

Я отправил очень похожая, но несколько более простая версия этого на связанный вопрос. Нашел только что.

Erwin Brandstetter 23.10.2011 08:15

http://www.postgresql.org/docs/8.2/static/sql-droptable.html

DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

Он не хочет бросать стол, если он существует. Он хочет создать его, если его не существует.

Peter Anselmo 16.12.2011 22:16

Это старый вопрос. Я возвращаюсь только для того, чтобы предложить другой ответ. Примечание: другие лучшие ответы уже существуют, это только в образовательных целях.

Самый простой способ - сделать то, что сказали другие; выполните CREATE TABLE, если вы хотите сохранить существующие данные, или выполните DROP IF EXISTS, а затем CREATE TABLE, если вам нужна только что созданная таблица.

Другой вариант - запросить системную таблицу на предмет ее существования и продолжить оттуда.

SELECT true FROM pg_tables WHERE tablename = <table> [AND schemaname = <schema>];

В использовании:

-- schema independent:
SELECT true FROM pg_tables WHERE tablename = 'foo';

-- schema dependent:
SELECT true FROM pg_tables WHERE tablename = 'foo' AND schemaname = 'bar';

Если он совпадает, у вас будет истинное значение, в противном случае он должен вернуть пустой набор данных. Вы можете использовать это значение, чтобы определить, нужно ли вам выполнить CREATE TABLE.

Стоит отметить, что если вы используете AND schemaname = <schema>, такие вещи, как временные таблицы, будут существовать, но будут помещены в другую схему ...

Mark Fowler 17.04.2013 19:00

Что я использовал, чтобы проверить, существует ли таблица (Java и PostgreSQL) до его создания. Я надеюсь, что это поможет кому-то. Часть создания таблицы здесь не реализована, просто проверьте, есть ли таблица уже существует. Передайте соединение с базой данных и tableName, и он должен вернуть, или таблица не существует.

public boolean SQLTableExists(Connection connection, String tableName) {
    boolean exists = false;

    try {
        Statement stmt = connection.createStatement();
        String sqlText = "SELECT tables.table_name FROM information_schema.tables WHERE table_name = '" + tableName + "'";    
        ResultSet rs = stmt.executeQuery(sqlText);

        if (rs != null) {
            while (rs.next()) {
                if (rs.getString(1).equalsIgnoreCase(tableName)) {
                    System.out.println("Table: " + tableName + " already exists!");
                    exists = true;
                } else { 
                    System.out.println("Table: " + tableName + " does not appear to exist.");
                    exists = false;
                }

            }
        }

    } catch (SQLException sqlex) {
        sqlex.printStackTrace();
    }
    return exists;
}

Возможно, вы захотите включить schema_name в запрос, чтобы одна и та же таблица находилась в разных схемах.

a_horse_with_no_name 27.04.2012 11:43

Я не уверен, когда он был добавлен, но для полноты картины хочу отметить, что в версии 9.1 (возможно, раньше) можно использовать IF NOT EXISTS. IF NOT EXISTS создаст таблицу, только если она еще не существует.

Пример:

CREATE TABLE IF NOT EXISTS users.vip
(
  id integer
)

Это создаст таблицу с именем vip в схеме users, если таблица не существует.

Источник

Это было реализовано в 9.1.

Erwin Brandstetter 16.09.2011 02:42

Самый простой ответ:

catch{

#create table here

}

При этом создается таблица, если она не существует, и возникает ошибка, если она существует. И ошибка отлавливается.

Лучший ответ был дан Скалли, если вы используете 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
    -- Do nothing
END;
$$
LANGUAGE plpgsql;

Попробуйте выполнить запрос к таблице. Если это вызывает исключение, перехватите исключение и создайте новую таблицу.

try {
    int a =  db.queryForInt("SELECT COUNT(*) FROM USERS;");
}
catch (Exception e) {
    System.out.print(e.toString());
    db.update("CREATE TABLE USERS (" +
                "id SERIAL," +
                "PRIMARY KEY(id)," +
                "name varchar(30) NOT NULL," +
                "email varchar(30) NOT NULL," +
                "username varchar(30) NOT NULL," +
                "password varchar(30) NOT NULL" +
                ");");
}
return db;

Другие вопросы по теме