簡體   English   中英

從兩個表插入到一個表的SQL語句(使用來自另一個無連接條件的表的ID)

[英]SQL Statement to INSERT into one table from two (using id from another w/no join criteria)

我有兩個表:

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是示例值

現在,我想從“ data_items”(剛創建的自動增量)中獲取每個ID,並在“ 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並插入這些行。

希望這是有道理的。 TIA。

  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

     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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM