我想将具有相同模式的两个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>
答案 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;