一次插入多个数据库表中

Posted

技术标签:

【中文标题】一次插入多个数据库表中【英文标题】:inserted in multiple tables of database at a time 【发布时间】:2010-04-06 10:01:20 【问题描述】:

我们可以同时处理具有相同数据库连接对象的多个数据库表吗?

假设我在表 1 中插入了值,同时也在数据库的表 2 中插入了具有相同数据库连接对象的值。

我在代码中使用 sqlite 数据库并在 commit() 时遇到数据库锁定异常。

【问题讨论】:

【参考方案1】:

任何事务都会锁定整个数据库。在任何正在进行的事务期间,您都无法访问 sqlite 数据库。

【讨论】:

我得到了以下异常,这与数据库锁定异常有关还是可能导致数据库锁定异常 Exception:call() 在不适当的状态下调用 stacktrace java.lang.IllegalStateException: call() 在不适当的情况下调用状态在 org.ibex.nestedvm.Runtime.call(Runtime.java:655) 在 org.ibex.nestedvm.Runtime.call(Runtime.java:647) 在 org.sqlite.NestedDB.call(NestedDB.java:406)在 org.sqlite.NestedDB.call(NestedDB.java:389) 在 org.sqlite.NestedDB.reset(NestedDB.java:135) 在 org.sqlite.RS.close(RS.java:98) 或者是由于 obj Connection.commit() 行导致数据库锁定异常 锁定异常几乎意味着数据库正在使用中。您必须为数据库操作使用一些包装库,检查它的文档以防您遗漏某些东西。并用代码更新帖子。【参考方案2】:

每个表需要一个语句,所有语句都使用相同的连接:

INSERT INTO t1(x, y, z) VALUES(1, 2, 4);
INSERT INTO t2(a, b, c) VALUES("FOO", "BAR", 2.1);

这些应该作为一个工作单元插入。

如果你从同一个对象插入值,你可能做错了什么。 “Say It Once and Only Once”表明不需要在两个不同的表中保存相同的值。我会插入一次并使用触发器将其放入历史表或类似的东西中。

【讨论】:

我得到了以下异常,这与数据库锁定异常有关还是可能导致数据库锁定异常 Exception:call() 调用状态不正确 stacktrace java.lang.IllegalStateException: call() 调用不适当状态在 org.ibex.nestedvm.Runtime.call(Runtime.java:655) 在 org.ibex.nestedvm.Runtime.call(Runtime.java:647) 在 org.sqlite.NestedDB.call(NestedDB.java:406)在 org.sqlite.NestedDB.call(NestedDB.java:389) 在 org.sqlite.NestedDB.reset(NestedDB.java:135) 在 org.sqlite.RS.close(RS.java:98)

以上是关于一次插入多个数据库表中的主要内容,如果未能解决你的问题,请参考以下文章

一次在多个表中插入/更新数据的最佳实践

mysql查询一次在单个查询中在多个表中插入记录

如何一次在多个表中添加行?

在 C# 中有效地将数据插入 MySQL 中的多个表中

SSIS一次将具有起始范围的递增ID插入多个表中

如何一次将多个值插入到 postgres 表中?