2013-01-16 27 views
1

我有兩個表:SQL語句(從另一個使用ID W /無連接標準)插入一個表從兩個

CREATE TABLE `data_items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `data` longtext NOT NULL, 
    `created` datetime NOT NULL, 
    `updated` datetime NOT NULL, 
    `data_item_type` varchar(255) NOT NULL, 
    `data_source_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `IDX_AFA125D21A935C57` (`data_source_id`), 
    CONSTRAINT `FK_AFA125D21A935C57` FOREIGN KEY (`data_source_id`) REFERENCES `data_sources` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=7192 DEFAULT CHARSET=utf8; 

CREATE TABLE `map_locations` (
    `id` int(11) NOT NULL, 
    `latitude` decimal(9,6) DEFAULT NULL, 
    `longitude` decimal(9,6) DEFAULT NULL, 
    `name` varchar(255) DEFAULT NULL, 
    `address` varchar(255) DEFAULT NULL, 
    `status` varchar(255) NOT NULL, 
    `message_codes` longtext NOT NULL, 
    PRIMARY KEY (`id`), 
    CONSTRAINT `FK_B28E0DE7BF396750` FOREIGN KEY (`id`) REFERENCES `data_items` (`id`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我試圖完成一個兩步過程。第一個查詢工作正常:

INSERT INTO data_items (`data`, created, updated, data_item_type, data_source_id) SELECT data_items.data, now(), now(), data_items.data_item_type, 2 
    FROM data_items 
    WHERE data_items.data_source_id = 1 

- > 1和2是示例值

現在,我要抓住每一個ID從「data_items」(即剛剛創建的自動INCS)和使用在「map_locations」表中插入每個新的(對應的行),當那些ID的。

所以,

data_items 
id | data_source_id 
1 | 1 
2 | 1 
3 | 2 
4 | 2 

map_locations 
id | content 
1 | aaa 
2 | bbb 
.... 
3 | aaa 
4 | bbb 

我需要複製行(1,2),使用來自data_items(3,4)的ID,並將這些行。

希望這是sense..it是相當混亂。 TIA。

回答

1
  1. 您需要新建立的data_items來引用它們的原始對應物;要做到這一點最簡單的方法是修改架構,以便該表包括自引用的外鍵:

    ALTER TABLE data_items 
        ADD COLUMN underlying_id INT(11) NULL, 
        ADD FOREIGN KEY (underlying_id) REFERENCES data_items (id) 
    
  2. 插入data_items就變成了:

    INSERT INTO data_items 
        (underlying_id, data, created, updated, data_item_type, data_source_id) 
    SELECT id, data, NOW(), NOW(), data_item_type, 2 
    FROM data_items 
    WHERE data_source_id = 1 
    
  3. 現在可以進行進行自連接,以獲得新創建id S:

    INSERT INTO map_locations 
        (id, content) 
    SELECT new.id, map_locations.content 
    FROM map_locations 
        JOIN data_items old USING (id) 
        JOIN data_items new ON new.underlying_id = old.id 
    WHERE old.data_source_id = 1 
    

    確保您內執行此查詢相同的事務之前的插入,使用(默認)REPEATABLE READ事務隔離級別,以確保對data_items表任何併發修改不會導致不一致的狀態。

  4. 再次,同一個事務中,清除underlying_id參考:

    UPDATE data_items SET underlying_id = NULL 
    
+0

感謝您深入的答案 - 我大多明白這一點。我的另一項任務開始工作,但我會很快再次訪問這個並試圖執行此項修復。謝謝 - 我會報告回來。 –

+0

+100給你!這工作 - 一個很酷的解決方案。再次感謝。 –

+0

我不明白最後一行...爲什麼我們清除「underlying_id」。我知道如果我們不這樣做,會發生FKC錯誤。 –

相關問題