You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一张表的多列向多对多表插入多行数据?

跨结构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:51:20