如何基于另一张表的多列向多对多表插入多行数据?
跨结构SQL Server数据迁移实践(T-SQL实现)
最近我正在推进一个跨结构差异极大的新数据库数据迁移工作,用的是SQL Server和T-SQL。先给大家梳理下涉及的核心表结构,以及目前的迁移进展:
核心表结构
我这边涉及四张关键表:
CallNotes(新系统的通话记录表)
Id:uniqueidentifier(主键)OldCallRecordId:int(仅用于迁移阶段关联旧数据,最终版本会删除该字段)Content:nvarchar(100)(存储通话记录内容)
CallTopics(新系统的通话主题表)
Id:uniqueidentifier(主键)Name:nvarchar(50)(主题名称)
CallNoteCallTopics(多对多关联表,关联通话记录和主题)
CallNoteId:uniqueidentifier(外键关联CallNotes.Id)CallTopicId:uniqueidentifier(外键关联CallTopics.Id)
OldCallRecords(旧系统的核心通话记录表,迁移数据的来源)
(注:旧表包含通话内容、关联主题等关键迁移数据)
当前迁移进展与关键T-SQL示例
目前我主要通过CallNotes中的OldCallRecordId字段来关联旧系统数据,分步骤完成迁移:
1. 迁移基础通话记录数据
先把旧系统的通话内容同步到新的CallNotes表:
INSERT INTO CallNotes (Id, OldCallRecordId, Content) SELECT NEWID() AS Id, ocr.Id AS OldCallRecordId, ocr.NoteContent AS Content FROM OldCallRecords ocr WHERE ocr.IsActive = 1 -- 按需筛选需要迁移的有效记录
2. 同步通话主题并建立关联
因为新系统用独立的CallTopics表存储主题,还需要处理多对多关联:
-- 先同步主题数据,避免重复插入 MERGE INTO CallTopics ct USING (SELECT DISTINCT TopicName FROM OldCallRecords) ocr ON ct.Name = ocr.TopicName WHEN NOT MATCHED THEN INSERT (Id, Name) VALUES (NEWID(), ocr.TopicName); -- 建立通话记录与主题的多对多关联 INSERT INTO CallNoteCallTopics (CallNoteId, CallTopicId) SELECT cn.Id AS CallNoteId, ct.Id AS CallTopicId FROM CallNotes cn JOIN OldCallRecords ocr ON cn.OldCallRecordId = ocr.Id JOIN CallTopics ct ON ocr.TopicName = ct.Name;
3. 迁移完成后的清理步骤
等所有数据验证无误后,就可以移除临时用的OldCallRecordId字段:
ALTER TABLE CallNotes DROP COLUMN OldCallRecordId;
内容的提问来源于stack exchange,提问作者Ryan Taite
相关产品推荐
相关产品推荐

