Postgresql:如果表格尚不存在,如何创建表格?

时间:2009-01-12 13:43:37

标签: sql database postgresql

在Postgresql中,如果表格尚不存在,我怎么能创建一个条件?

代码示例表示赞赏。

10 个答案:

答案 0 :(得分:77)

我不确定它何时添加,但为了完整起见,我想指出在版本9.1(可能之前)IF NOT EXISTS可以使用。 IF NOT EXISTS只会在不存在的情况下创建表。

示例:

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

如果表不存在,这将在架构vip中创建一个名为users的表。

Source

答案 1 :(得分:21)

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();

答案 2 :(得分:13)

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

答案 3 :(得分:10)

我想检查一下pg_class表可能对你有帮助,比如:

SELECT COUNT (relname) as a FROM pg_class WHERE relname = 'mytable'

if a = 0 then (CREATE IT)

问候。

答案 4 :(得分:6)

这是一个老问题。我只是带回来提出另一个答案。注意: 已存在其他更好的答案,这仅用于教育目的

最简单的方法是做别人所说的话;如果要保留现有数据,请执行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。

答案 5 :(得分:2)

如果您正在运行Postgresql 9.1 +,那么Skalli已经给出了最佳答案。

如果像我一样你需要使用Postgresql 8.4,你可以使用带有'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;

答案 6 :(得分:1)

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

答案 7 :(得分:1)

最简单的答案是:

catch{

#create table here

}

如果不存在,则创建一个表,如果存在则产生错误。并且错误被捕获。

答案 8 :(得分:0)

http://www.postgresql.org/docs/8.2/static/sql-droptable.html

DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]

答案 9 :(得分:-1)

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

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;