В Postgresql, как я могу выполнить условие для создания таблицы только в том случае, если она еще не существует?
Пример кода оценен.
В Postgresql, как я могу выполнить условие для создания таблицы только в том случае, если она еще не существует?
Пример кода оценен.
Я не уверен, когда он был добавлен, но для полноты я хотел бы указать, что в версии 9.1 (возможно, раньше) IF NOT EXISTS
можно использовать. IF NOT EXISTS
создаст таблицу только в том случае, если она уже не существует.
Пример:
CREATE TABLE IF NOT EXISTS users.vip
(
id integer
)
Это создаст таблицу с именем vip
в схеме users
, если таблица не существует.
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();
Просто создайте таблицу и не беспокойтесь о том, существует ли она. Если он не существует, он будет создан; если он существует, таблица не будет изменена. Вы всегда можете проверить возвращаемое значение вашего SQL-запроса, чтобы увидеть, существовала ли таблица или нет, когда вы выполнили оператор create.
Я думаю, что проверка таблицы pg_class может помочь вам, что-то вроде этого:
SELECT COUNT (relname) as a FROM pg_class WHERE relname = 'mytable'
if a = 0 then (CREATE IT)
С уважением.
Это старый вопрос. Я только возвращаюсь, чтобы предложить другой ответ. Примечание: другие лучшие ответы уже существуют, это только для образовательных целей.
Самый простой способ - сделать то, что сказали другие; выполните 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.
Лучший ответ был предоставлен Скалли, если вы используете 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;
Что я использовал для проверки наличия или отсутствия таблицы (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;
}
Самый простой ответ:
catch{
#create table here
}
Это создает таблицу, если она не существует, и создает ошибку, если существует. И ошибка поймана.
Попробуйте выполнить запрос в таблице. Если он генерирует исключение, то поймайте исключение и создайте новую таблицу.
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;
http://www.postgresql.org/docs/8.2/static/sql-droptable.html
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]