Postgresql:如何创build表,如果它不存在?

在Postgresql中,我如何才能创build一个条件来创build一个表,如果它不存在?

代码示例赞赏。

我不确定何时添加,但为了完整起见,我想指出,在9.1版(也许之前)可以使用IF NOT EXISTSIF NOT EXISTS不存在,只会创build表。

例:

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

如果表不存在,这将在模式users创build一个名为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(); 

只需创build表格,不用担心它是否存在。 如果它不存在,它将被创build; 如果确实存在,表格将不会被修改。 您可以随时检查SQL查询的返回值,以查看执行create语句时该表是否存在。

我想检查一下pg_class表可能对你有帮助,就像这样:

 SELECT COUNT (relname) as a FROM pg_class WHERE relname = 'mytable' if a = 0 then (CREATE IT) 

问候。

这是一个古老的问题。 我只是想提出另一个答案。 注意: 其他更好的答案已经存在,这仅仅是为了教育目的

最简单的方法就是去做别人所说的话。 如果要保留现有数据,则执行CREATE TABLE;如果需要新创build的表,则执行DROP IF EXISTS,然后执行CREATE TABLE。

另一种select是查询系统表的存在并从那里继续。

 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+,Skalli已经给出了最好的答案。

如果像我一样,你需要使用Postgresql 8.4来做到这一点,你可以使用一个带有'duplicate_table'exception捕获的函数。

这会在表存在时忽略生成的错误,并继续生成其他错误。

这里是一个在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; 

在创build表之前,我用来检查表是否存在(Java&PostgreSQL)。 我希望这可以帮助别人。 创build表部分在这里没有实现,只是检查一下表是否已经存在。 传入数据库和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; } 

最简单的答案是:

 catch{ #create table here } 

这将创build一个表(如果不存在),并在存在的情况下产生错误。 错误被抓住了。

尝试在表上运行查询。 如果它抛出exception,则捕获exception并创build一个新表。

 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 ]