我有两张桌子:
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'(刚刚创建的auto-incs)获取每个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
我需要复制row(1,2),使用data_items(3,4)中的id并插入这些行。
希望这是有道理的......这很令人困惑。 TIA。
答案 0 :(得分:1)
您需要新创建的data_items
来引用其原始对应项;最简单的方法是修改模式,使表包含自引用外键:
ALTER TABLE data_items
ADD COLUMN underlying_id INT(11) NULL,
ADD FOREIGN KEY (underlying_id) REFERENCES data_items (id)
然后插入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
现在可以执行自联接以获取新创建的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
表的任何并发更改都不会导致不一致的状态。
同样,在同一交易中,清除underlying_id
参考:
UPDATE data_items SET underlying_id = NULL