[英]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.