Postgresql:如何仅在表不存在时创建表?
在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
代码示例 只需创建表,不必担心它是否存在。如果它不存在,它将被创建;如果确实存在,则不会修改该表。在执行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;