我正在使用sqlite4java来处理sqlite db。我现在想要将数据库中的表复制到dbtest。所以我在stackoverflow上找到了代码。但我总是犯错误。首先,我打开与新创建的数据库的连接,然后使用以下命令附加另一个数据库:
ATTACH DATABASE数据库AS数据库;
这很好用。 dbtest已作为新数据库开放。 然后我想复制表:因此,表已经创建,并且与其他数据库中的表相同。
INSERT INTO dbtest.Routing(id,source,destination,metadata,zone_src,zone_dst,cost)SELECT * FROM database.Routing;
但执行此操作后,我收到错误:
com.almworks.sqlite4java.SQLiteException:[1] DB [1] exec()没有这样的表:dbtest.Routing
我也尝试使用sqlite Studio并且它没有任何问题,但是我无法在那里附加数据库(这是自动完成的)。我是否必须使用其他表示法来使用两个数据库?
修改: 我现在用CL的答案。但这导致了新的问题:
com.almworks.sqlite4java.SQLiteException:[1] DB [1] exec()没有这样的表:second.Routing
我改变了什么?
ATTACH DATABASE数据库AS第二; //数据库文件的新名称,它将作为第二个附加,因为如果我使用调试函数,它说:数据库第二个已经在使用。
如果我使用此命令,我会收到上述错误。
INSERT INTO Routing(id,source,destination,metadata,zone_src,zone_dst,cost)SELECT * FROM second.Routing;
使用数据库文件的绝对路径解决了问题。
答案 0 :(得分:1)
附加数据库的名称不是其文件名,但是您在AS
语句的ATTACH
子句中指定的名称。
主数据库(附加了其他数据库的数据库)的名称也不是其文件名。它的名字总是main
。
要在主数据库中指定表的名称,请使用main.Routing
或Routing
。
请注意,如果文件尚不存在,SQLite非常乐意创建新数据库,因此您必须确保为ATTACH
语句提供正确的文件名。
如果数据库文件未命名为database
,或者它不在当前目录中,则second
数据库将为空。
强烈建议始终提供完整的文件路径,如下所示:
ATTACH DATABASE '/some/where/whatever.db' AS second;