Foreign-Key

為相同的數據組合具有不同外鍵值的表(firefox)

  • February 7, 2022

我正在將兩台電腦的 Firefox 歷史記錄與以下命令結合起來:

ATTACH 'filename' AS toMerge
INSERT or IGNORE INTO moz_origins SELECT * FROM toMerge.moz_origins;
INSERT or IGNORE INTO moz_places SELECT * FROM toMerge.moz_places;
INSERT or IGNORE INTO moz_inputhistory SELECT * FROM toMerge.moz_inputhistory;
INSERT or IGNORE INTO moz_historyvisits SELECT * FROM toMerge.moz_historyvisits;

下面是這四個表的模式(來自 DB Browser)。數據庫在 sqlite 中。

CREATE TABLE moz_origins ( id INTEGER PRIMARY KEY, prefix TEXT NOT NULL, host TEXT NOT NULL, frecency INTEGER NOT NULL, UNIQUE (prefix, host) )
CREATE TABLE moz_places ( id INTEGER PRIMARY KEY, url LONGVARCHAR, title LONGVARCHAR, rev_host LONGVARCHAR, visit_count INTEGER DEFAULT 0, hidden INTEGER DEFAULT 0 NOT NULL, typed INTEGER DEFAULT 0 NOT NULL, favicon_id INTEGER, frecency INTEGER DEFAULT -1 NOT NULL, last_visit_date INTEGER , guid TEXT, foreign_count INTEGER DEFAULT 0 NOT NULL, url_hash INTEGER DEFAULT 0 NOT NULL, description TEXT, preview_image_url TEXT, origin_id INTEGER REFERENCES moz_origins(id))
CREATE TABLE moz_inputhistory ( place_id INTEGER NOT NULL, input LONGVARCHAR NOT NULL, use_count INTEGER, PRIMARY KEY (place_id, input))
CREATE TABLE moz_historyvisits ( id INTEGER PRIMARY KEY, from_visit INTEGER, place_id INTEGER, visit_date INTEGER, visit_type INTEGER, session INTEGER)

我的問題是外鍵約束問題,其中moz_origins要合併的主表和表包含相同host但有不同的id. 看這裡:

moz_origins:
id    prefix         host
-------------------------------
13    https://   www.youtube.com
756   https://   youtube.com

toMerge.moz_origins:
id    prefix         host
-------------------------------
1512  https://   www.youtube.com
5854  https://   youtube.com

有沒有一種方法可以在重寫兩個表之間共享的任何位置時合併toMerge.moz_places到其中?moz_places``origin_id``host``moz_origins

我在理解如何到達那裡的最遠的地方是這些命令集:

SELECT url,origin_id FROM toMerge.moz_places WHERE origin_id NOT IN ( SELECT id FROM moz_origins);
SELECT host,id FROM toMerge.moz_origins WHERE host IN ( SELECT host FROM moz_origins);
SELECT A.[prefix],B.[host],A.[id] FROM moz_origins A INNER JOIN toMerge.moz_origins B ON A.host == B.host;

我最終使用了Firefox History Merger(在撰寫本文時為 2.12.0),並將我稍舊的 Firefox 數據庫與我目前的數據庫合併。我不記得我的舊 Firefox 版本是什麼,但我在發這篇文章時使用的是 Firefox v96.0.3。

引用自:https://dba.stackexchange.com/questions/306841