插入表,如果表不存在,则创建表然后插入

Posted

技术标签:

【中文标题】插入表,如果表不存在,则创建表然后插入【英文标题】:insert into table, if table not exist, create table and then insert 【发布时间】:2014-02-28 13:30:16 【问题描述】:

我们需要一个可以在表中插入行的java代码,如果表不存在,那么它将创建一个新的然后插入到该表中。

就像我们正在跟踪对我们服务器的每个请求,然后将其保存在一个表中。 表名应该是 request_month-name_*year*,是动态传递的。目的是保持每个月的表格独立于其他表格。

我们使用的代码是

try
  dao.insertTracking(object, year, month);
catch(BadSqlGrammarException e)
    dao.createTable(year, month);
    dao.insertracking(object, year, month);
catch(Exception e)
    e.printStackTrace();

问题是在许多其他情况下也可能抛出 BadSqlGrammarException。

所以我的问题是如何有效地处理这种类型的情况,而不捕获泛化异常然后再次处理?

另外,我们可以先检查表的存在,但是这会给系统带来很大的负担,因为每天要处理大量的请求。

使用 jdbctemplates 和/与 mysql

【问题讨论】:

【参考方案1】:

你想稍微改变一下逻辑。如果表不存在,则创建表,然后插入:

create table if not exists tablename . . .

insert into tablename(cols)
    select values;

如果你这样做,那么你不需要任何条件逻辑。无论表是否已经存在,相同的代码都可以工作。

【讨论】:

【参考方案2】:

使用异常处理来执行预期的业务逻辑通常是一个坏主意,并且您的问题“问题是在许多其他情况下也可以抛出 BadSqlGrammarException”中提到的问题。给出了原因。

在您的创建表方法中,您可以先测试表是否存在,如果存在则不执行任何操作。

那么你可以一直调用create table,而不仅仅是在异常情况下。

【讨论】:

每次检查表存在时的性能结果是什么?这是个好主意吗? 实际上我阅读了 Gordon Linoff 的回答,我更喜欢这个想法。如果不存在则创建表比先询问它是否存在要干净得多。【参考方案3】:

首先创建一个检查表是否存在的函数。 This SO question 展示了如何为此使用 INFORMATION_SCHEMA。如果该表不存在,请调用另一个函数,该函数将调用您的 create table script。

if(!FunctionForTableExists()) 
    FunctionForCreateTable();


...code for insert...

【讨论】:

【参考方案4】:

最终通过使用石英调度程序以所需的时间间隔运行。

【讨论】:

以上是关于插入表,如果表不存在,则创建表然后插入的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 仅在表不存在时插入数据

Laravel 模型 - 如果数据库表不存在则返回 null

JDBC 声明表不存在

Postgres 如果不存在则插入多行,如果存在或插入则返回所有 id,然后使用所有 id 插入另一个表

访问:如果表不存在则创建表

oracle表中如果存在就不更新,如果不存在就插入的语句怎么写