Postgresql: как создать таблицу только в том случае, если она еще не существует?
В Postgresql, как я могу выполнить условие для создания таблицы только в том случае, если она еще не существует?
Пример кода оценен.
Ответы
Ответ 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;
Ответ 10
http://www.postgresql.org/docs/8.2/static/sql-droptable.html
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]