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


Просто создайте таблицу и не беспокойтесь о том, существует ли она. Если его не существует, он будет создан; если он существует, таблица не будет изменена. Вы всегда можете проверить возвращаемое значение вашего SQL-запроса, чтобы увидеть, существует ли таблица или нет, когда вы выполняете оператор create.
В большинстве случаев вам действительно не о чем беспокоиться: когда создание происходит внутри транзакции, это приведет к прерыванию транзакции.
Лично я считаю, что такой тип ответа / мышления поощряет плохие практики. Если я ожидал, что таблица может существовать, необходимо проверить это, а не проверить наличие ошибки. Может быть, в 2011 году парадигма работает иначе? Прямо сейчас, когда кто-то пытается создать таблицу, которая уже существует, dbms создает ошибку.
Я думаю, что проверка таблицы 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();
Это не принимает во внимание текущую схему, то есть проверяет, существует ли таблица в схеме любой, и не создает ее в текущей, если это так.
Я отправил очень похожая, но несколько более простая версия этого на связанный вопрос. Нашел только что.
http://www.postgresql.org/docs/8.2/static/sql-droptable.html
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
Он не хочет бросать стол, если он существует. Он хочет создать его, если его не существует.
Это старый вопрос. Я возвращаюсь только для того, чтобы предложить другой ответ. Примечание: другие лучшие ответы уже существуют, это только в образовательных целях.
Самый простой способ - сделать то, что сказали другие; выполните 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>, такие вещи, как временные таблицы, будут существовать, но будут помещены в другую схему ...
Что я использовал, чтобы проверить, существует ли таблица (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 в запрос, чтобы одна и та же таблица находилась в разных схемах.
Я не уверен, когда он был добавлен, но для полноты картины хочу отметить, что в версии 9.1 (возможно, раньше) можно использовать IF NOT EXISTS. IF NOT EXISTS создаст таблицу, только если она еще не существует.
Пример:
CREATE TABLE IF NOT EXISTS users.vip
(
id integer
)
Это создаст таблицу с именем vip в схеме users, если таблица не существует.
Это было реализовано в 9.1.
Самый простой ответ:
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;
Что вы хотите, чтобы произошло, если определение вашей таблицы не соответствует существующему? Ошибка, изменить таблицу, ничего не делать? Некоторый контекст может помочь.