Подтвердить что ты не робот

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

В Postgresql, как я могу выполнить условие для создания таблицы только в том случае, если она еще не существует?

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

4b9b3361

Ответ 1

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

Пример:

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

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

Источник

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

if a = 0 then (CREATE IT)

С уважением.

Ответ 5

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

Самый простой способ - сделать то, что сказали другие; выполните 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.

Ответ 6

Лучший ответ был предоставлен Скалли, если вы используете Postgresql 9.1 +.

Если мне нравится, что вам нужно сделать это с помощью Postgresql 8.4, вы можете использовать функцию с catch'ом 'duplicate_table' catch.

Это приведет к игнорированию сгенерированной ошибки, если таблица существует и продолжает генерировать другие ошибки.

Вот пример работы с 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;

Ответ 7

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

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;
}

Ответ 8

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

catch{

#create table here

}

Это создает таблицу, если она не существует, и создает ошибку, если существует. И ошибка поймана.

Ответ 9

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

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;