我在數據庫中有兩個表。在第一個表格(tab1)中,我有一個項目列表。在第二張表中,我有這些項目之間的多對多關係。複製兩個相關表中的選擇
CREATE TABLE tab1(id INTEGER PRIMARY KEY ASC,set INTEGER, name TEXT);
CREATE TABLE tab2(id INTEGER PRIMARY KEY ASC,id1 INTEGER,id2 INTEGER,relationship TEXT);
在第一個表中的項目由集,都爲set
字段的值相同。我想用新的集合ID複製任何給定集合,使得新集合包含原始集合的相同元素和關係。如果集合中的所有項目都有順序ID,我可以按如下方式進行操作。首先,找到集合中最高的ID(在這種情況下,集合3):
SELECT id FROM tab1 WHERE set=3 ORDER BY id DESC LIMIT 1
我將它分配給變量$ oldid。接下來,我重複項TAB1匹配指定的一組,給他們一個新的集(在這種情況下37)
INSERT INTO tab1 (set,name) SELECT 37, name FROM tab1 WHERE set=3 ORDER BY id ASC
我再拿到插入的最後一行的id,並將其分配給變量$ NEWID :
SELECT last_insert_rowid()
然後我分配$ diff = $ newid- $ oldid。由於原集有順序ID,我可以簡單地選擇原來的關係爲集= 3,然後加入不同:
INSERT INTO tab2 (id2,id2,relationship) SELECT id1+$diff,id2+$diff,type FROM tab WHERE id1 IN (SELECT id FROM tab WHERE set=3)
但是,如果設置不TAB1由連續的id這是行不通的。我可以對原始ID進行完整查詢,然後創建一個1:1映射到新插入的集合37的ID,然後添加每行之間的差異,然後將新計算的行插入表中。但是這需要將所有選擇加載到客戶端並完成客戶端上的所有工作。有一種方法可以在一般情況下創建一個在服務器上執行的查詢嗎?
看起來這可以做到這一點。 id1列看起來不錯,但id2列似乎是原始ID,而不是重複的ID。我嘗試用'(SELECT id FROM tab1 WHERE set = 37 AND name =(SELECT name FROM tab1 WHERE id = tab2.id2))替換'id2'作爲id2',這似乎工作。 – Michael