如何使用具有最新时间戳的条目合并具有相同模式的两个数据库

时间:2015-03-01 08:58:24

标签: sqlite

我想将具有相同模式的两个SQLite3数据库与唯一关键字合并。但是在合并时,如果发现两个数据库中的两个条目相同,那么我想合并具有最新时间戳的条目。

例如我有两个数据库:
1. student_old.db
2. student_new.db

两个DB的架构是:

CREATE TABLE student (
 'idx' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
 'name' CHAR(32) NOT NULL,
 'age' INTEGER NOT NULL default 0,
'lastUpdateDate' timestamp DATE DEFAULT (datetime('now','localtime')),
  UNIQUE (name)
  );

两个dbs的条目是:

student_old.db 
---------------
sqlite3 student_old.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from student;
1|abcd|20|2015-03-01 00:32:29
2|efgh|22|2015-03-01 00:32:29
3|ijkl|24|2015-03-01 00:32:29
sqlite>

student_new.db 
---------------
sqlite3 student_new.db
sqlite> select * from student;
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
1|abcd|28|2015-03-01 00:32:34
2|mnop|26|2015-03-01 00:32:34
3|qrst|27|2015-03-01 00:32:34
sqlite>

我正在使用以下查询将student_new.db合并到student_old.db

sqlite3 student_old.db <<"EOF"
attach './student_new.db' as toMerge;
BEGIN;
insert or ignore into student (name, age,lastUpdateDate)
select name, age, lastUpdateDate from toMerge.student;
COMMIT;
.q

所以在合并后我会得到

sqlite3 student_old.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from student;
1|abcd|20|2015-03-01 00:32:29 ------>>>> I got the time stamp of student_old.db
2|efgh|22|2015-03-01 00:32:29
3|ijkl|24|2015-03-01 00:32:29
5|mnop|26|2015-03-01 00:32:34
6|qrst|27|2015-03-01 00:32:34
sqlite>

但是我想合并相同记录的条目,但是要使用最新的时间戳。 像这样:

sqlite> select * from student;
1|abcd|20|2015-03-01 00:32:34 ------>>>> I want entry of latest time stamp for 
same record.
2|efgh|22|2015-03-01 00:32:29
3|ijkl|24|2015-03-01 00:32:29
5|mnop|26|2015-03-01 00:32:34
6|qrst|27|2015-03-01 00:32:34
sqlite>

1 个答案:

答案 0 :(得分:0)

要确保替换旧版时间戳的student_old行,您必须明确删除它们:

ATTACH 'student_new.db' as toMerge;

BEGIN;

DELETE FROM student
WHERE EXISTS (SELECT 1
              FROM toMerge.student
              WHERE name           = main.student.name
                AND lastUpdateDate > main.student.lastUpdateDate);

INSERT OR IGNORE INTO main.student(name, age, lastUpdateDate)
SELECT name, age, lastUpdateDate
FROM toMerge.student;

COMMIT;