代码示例将被赞赏。
我不确定这是何时添加的,但为了完整起见,我想指出在9.1版本(也许之前)可以使用IF NOT EXISTS
。 IF NOT EXISTS
仅在表不存在时创建该表。
示例:
CREATE TABLE IF NOT EXISTS users.vip
(
id integer
)
如果表不存在,则会在架构users
中创建一个名为vip
的表。
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';
如果匹配成功,将返回 true 值,否则应该返回一个空数据集。您可以使用该值来确定是否需要执行 CREATE TABLE 操作。
AND schemaname = <schema>
,那么像临时表这样的东西将存在,但会被放置在不同的模式中... - Mark Fowler如果您正在运行Postgresql 9.1+,Skalli提供了最佳答案。
如果像我一样需要在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;
catch{
#create table here
}
在创建表之前,我用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;
}
http://www.postgresql.org/docs/8.2/static/sql-droptable.html
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
尝试在表上运行查询。如果它抛出异常,则捕获该异常并创建一个新表。
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;