插入表,如果表不存在,则创建表然后插入
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】:最终通过使用石英调度程序以所需的时间间隔运行。
【讨论】:
以上是关于插入表,如果表不存在,则创建表然后插入的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 模型 - 如果数据库表不存在则返回 null