簡體   English   中英

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

[英]Postgresql: how to create table only if it does not already exist?

在Postgresql中,如果表格尚不存在,我怎么能創建一個條件呢?

代碼示例贊賞。

我不確定它何時被添加,但為了完整起見,我想指出在版本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';

如果它匹配,你將有一個真值,否則它應該返回一個空數據集。 您可以使用該值來確定是否需要執行CREATE TABLE。

如果您正在運行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;

我在創建表之前用來檢查表是否存在(Java和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;
}

最簡單的答案是:

catch{

#create table here

}

如果不存在,則創建表,如果存在則生成錯誤。 並且錯誤被抓住了。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM