Postgresql: как создать таблицу, только если она еще не существует? - PullRequest
39 голосов
/ 12 января 2009

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

Пример кода приветствуется.

Ответы [ 10 ]

77 голосов
/ 14 сентября 2011

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

Пример:

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

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

Источник

21 голосов
/ 12 января 2009
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();
13 голосов
/ 12 января 2009

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

10 голосов
/ 12 января 2009

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

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

if a = 0 then (CREATE IT)

Привет.

6 голосов
/ 19 апреля 2011

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

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

2 голосов
/ 14 февраля 2012

Лучший ответ дал Скалли, если вы используете 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;
1 голос
/ 28 октября 2011

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

catch{

#create table here

}

Создает таблицу, если она не существует, и выдает ошибку, если она существует. И ошибка ловится.

1 голос
/ 22 августа 2011

Что я использовал, чтобы проверить, существует ли таблица (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;
}
0 голосов
/ 30 июля 2012

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

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;
0 голосов
/ 24 мая 2010

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

DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...