Tso*_*ort 3 export sybase import sybase-sql-anywhere
为了更新数据库(Sybase Adaptive Server Anywhere 8),我从客户端计算机上的一个数据库中获取所有数据并使用
SELECT * FROM tabelName OUTPUT TO 'C:\path' FORMAT ASCII DELIMITED BY ';';
Run Code Online (Sandbox Code Playgroud)
然后我使用这些文件来更新另一个连接到服务器的数据库,方法是制作临时表,检查是否缺少任何内容,然后删除临时表。
INPUT INTO tempTable FROM 'C:\path' FORMAT ASCII DELIMITED BY ';';
INSERT INTO mainTable
SELECT *
FROM tempTable
WHERE id NOT IN (SELECT id FROM mainTable);
DROP TABLE tempTable;
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有更好的方法来做到这一点,因为两个表需要很长时间来导出和导入数据(尽管它们确实有大量的列和数据,但仍然和大量的数据我的意思是〜100列和约 100,000 行)。这尤其奇怪,因为另一个具有相似数据量的表通过得非常快(尽管它的列确实较少)。需要一段时间的两个表每秒读取约 1000 个数据,而其他表要快得多。
每个客户的笔记本电脑上都有 database.db 文件。他们获取了一些数据并需要提交它但没有连接,因此他们使用自己的 .db 文件并稍后更新服务器上的文件。
获取 SQL 定义可能很困难,因为表是在前一段时间制作的,我不知道如何获取它们。目标数据库是保存所有数据的数据库,而源数据库是未连接且可在需要时离线使用的数据库。
一些建议,提示将不胜感激。
在不涉及在 Sybase SQL Anywhere 8 中执行此操作所需语言的具体细节的情况下,该版本现已超过 15 年,我建议使用以下内容:
导出函数将执行如下操作:
SELECT *
FROM tableName
WHERE tableName.KeyColumn NOT IN (
SELECT KeyColumn
FROM PreviouslyExportedTable
)
OUTPUT TO 'C:\path' FORMAT ASCII DELIMITED BY ';';
Run Code Online (Sandbox Code Playgroud)然后,导出器将PreviouslyExportedTable
不存在的行插入到中。下次运行导出器时,它只会导出尚未导出的新行。插入代码可能如下所示:
INSERT INTO PreviouslyExportedTable
SELECT KeyColumn
FROM TableName
WHERE KeyColumn NOT IN (
SELECT KeyColumn
FROM PreviouslyExportedTable
);
Run Code Online (Sandbox Code Playgroud)这应该会大大减少每次需要导出和导入的行数。我不确定 SQL Anywhere 8 是否支持 usingWHERE NOT EXISTS
子句而不是WHERE NOT IN
; 如果可行,该NOT EXISTS
变体可能会更快。
归档时间: |
|
查看次数: |
2392 次 |
最近记录: |