我有大约200个sqlite数据库副本.所有在不同的时间采用不同的数据.删除了一些行,并添加了一些行.它们都在一个目录中.
我想使用目录中的所有.db文件合并表my_table中的所有行.我希望删除重复的行,只显示所有数据库的所有内容.
我想在纯sql中这样做,但我不认为这是可能的,所以我们也可以使用Python.
表定义:
CREATE TABLE my_table ( ROWID INTEGER PRIMARY KEY AUTOINCREMENT,guid TEXT UNIQUE NOT NULL,text TEXT,replace INTEGER DEFAULT 0,service_center TEXT,handle_id INTEGER DEFAULT 0,subject TEXT,country TEXT,attributedBody BLOB,version INTEGER DEFAULT 0,type INTEGER DEFAULT 0,service TEXT,account TEXT,account_guid TEXT,error INTEGER DEFAULT 0,date INTEGER,date_read INTEGER,date_delivered INTEGER,is_delivered INTEGER DEFAULT 0,is_finished INTEGER DEFAULT 0,is_emote INTEGER DEFAULT 0,is_from_me INTEGER DEFAULT 0,is_empty INTEGER DEFAULT 0,is_delayed INTEGER DEFAULT 0,is_auto_reply INTEGER DEFAULT 0,is_prepared INTEGER DEFAULT 0,is_read INTEGER DEFAULT 0,is_system_message INTEGER DEFAULT 0,is_sent INTEGER DEFAULT 0,has_dd_results INTEGER DEFAULT 0,is_service_message INTEGER DEFAULT 0,is_forward INTEGER DEFAULT 0,was_downgraded INTEGER DEFAULT 0,is_archive INTEGER DEFAULT 0,cache_has_attachments INTEGER DEFAULT 0,cache_roomnames TEXT,was_data_detected INTEGER DEFAULT 0,was_deduplicated INTEGER DEFAULT 0,is_audio_message INTEGER DEFAULT 0,is_played INTEGER DEFAULT 0,date_played INTEGER,item_type INTEGER DEFAULT 0,other_handle INTEGER DEFAULT -1,group_title TEXT,group_action_type INTEGER DEFAULT 0,share_status INTEGER,share_direction INTEGER,is_expirable INTEGER DEFAULT 0,expire_state INTEGER DEFAULT 0,message_action_type INTEGER DEFAULT 0,message_source INTEGER DEFAULT 0 )
解决方法
要能够同时访问主数据库和快照,请使用
ATTACH.
要删除行的旧版本,请使用 INSERT OR REPLACE:
要删除行的旧版本,请使用 INSERT OR REPLACE:
ATTACH 'snapshot123.db' AS snapshot; INSERT OR REPLACE INTO main.my_table SELECT * FROM snapshot.my_table; DETACH snapshot;
按照从最旧到最新的顺序对所有数据库执行此操作.
(sqlite没有这种循环控制机制;在Python中执行此循环.)
或者,您可以从最新和最旧的方向向后移动,并仅插入尚不存在的行:
ATTACH 'snapshot123.db' AS snapshot; INSERT OR IGNORE INTO main.my_table SELECT * FROM snapshot.my_table; DETACH snapshot;