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

时间:2014-02-28 13:30:16

标签: java mysql jdbctemplate

我们需要一个可以在表中插入行的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。

4 个答案:

答案 0 :(得分:2)

你想稍微改变逻辑。创建表,如果它不存在,然后插入其中:

create table if not exists tablename . . .

insert into tablename(cols)
    select values;

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

答案 1 :(得分:2)

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

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

然后你可以一直调用create table,而不仅仅是在Exception案例中。

答案 2 :(得分:0)

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

的函数
if(!FunctionForTableExists()) {
    FunctionForCreateTable();
}

...code for insert...

答案 3 :(得分:0)

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