Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql:如何仅在表不存在时创建表?_Sql_Database_Postgresql - Fatal编程技术网

Postgresql:如何仅在表不存在时创建表?

Postgresql:如何仅在表不存在时创建表?,sql,database,postgresql,Sql,Database,Postgresql,在Postgresql中,如果表还不存在,我如何设置条件来创建表 代码示例 只需创建表,不必担心它是否存在。如果它不存在,它将被创建;如果确实存在,则不会修改该表。在执行create语句时,您可以随时检查SQL查询的返回值,以查看该表是否存在。我认为检查pg_类表可能会对您有所帮助,例如: SELECT COUNT (relname) as a FROM pg_class WHERE relname = 'mytable' if a = 0 then (CREATE IT) 问候。 crea

在Postgresql中,如果表还不存在,我如何设置条件来创建表


代码示例

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

我认为检查pg_类表可能会对您有所帮助,例如:

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

if a = 0 then (CREATE IT)
问候。

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

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

最简单的方法就是照别人说的去做;如果要保留现有数据,请执行创建表;如果需要新创建的表,请执行删除(如果存在),然后执行创建表

另一种方法是查询系统表是否存在,然后从那里开始

SELECT true FROM pg_tables WHERE tablename = <table> [AND schemaname = <schema>];

如果匹配,您将得到一个真值,否则它将返回一个空数据集。您可以使用该值来确定是否需要执行创建表。

我用来检查表是否存在的内容(Java和PostgreSQL) 在创建它之前。我希望这对某人有帮助。 这里没有实现createtable部分,只是检查一下 表已存在。 传入到数据库和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;
}

我不确定它是什么时候添加的,但为了完整起见,我想指出,在9.1版(可能在之前)中,如果不存在,可以使用
<代码>如果不存在
将仅在表不存在时创建该表

例如:

CREATE TABLE IF NOT EXISTS users.vip
(
  id integer
)
如果表不存在,这将在模式
users
中创建一个名为
vip
的表


最简单的答案是:

catch{

#create table here

}

如果不存在,则创建一个表;如果存在,则生成一个错误。如果您运行的是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;

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

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;

如果表定义与现有定义不匹配,您希望发生什么?错误,修改表,不执行任何操作?一些上下文可能会有所帮助。这不会考虑当前架构,也就是说,它会检查该表是否存在于任何架构中,如果存在,则不会在当前架构中创建它。我在相关问题上发布了一篇文章。刚刚找到这个。大多数时候你确实不必担心。当创建发生在事务内部时,因为它会导致事务中止。我个人认为,这种回答/思考会鼓励不良做法。如果我预期表可能存在,那么必须进行测试,而不是检查错误条件。也许在2011年,范式的运作方式有所不同?现在,当一个人试图创建一个已经存在的表时,dbms会创建一个错误。这个错误已经在9.1中实现了。如果表已经存在,他不想删除它。如果不存在,他希望创建它。您可能希望在查询中包含schema_名称,以便在不同的架构中为同一个表提供服务。值得注意的是,如果您使用
和schemaname=
,像临时表这样的东西将存在,但将放在不同的架构中。。。
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;
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;