合并数据库时如何用SQL脚本向多对多关联表Bind插入已有连接?
解决多对多关联表Bind的数据插入问题
嘿,针对你现在要往Bind表插入多对多关联的需求,我给你几种实用的解决方案:
1. 直接批量插入单个模块的关联数据
如果只是像你说的,给ModuleID=1绑定多个MessageID,用INSERT INTO ... VALUES批量插入就可以了,写法很直观:
INSERT INTO [dbo].[Bind] (ModuleID, MessageID) VALUES (1, 5), (1, 1), (1, 7), (1, 9), (1, 6);
2. 一次性插入多个模块的关联关系
如果还有其他模块的关联需要插入,直接在VALUES列表里追加就行,不用分开执行多次插入:
INSERT INTO [dbo].[Bind] (ModuleID, MessageID) VALUES (1, 5), (1, 1), (1, 7), (1, 9), (1, 6), (2, 3), -- 比如ModuleID=2绑定MessageID=3 (2, 4); -- ModuleID=2绑定MessageID=4
3. 从旧数据库迁移关联数据(如果关联关系来自原库)
如果这些关联关系本来就在另一个要合并的数据库里,直接用SELECT语句迁移更高效,不用手动写VALUES:
-- 假设旧数据库名为OldDatabase,表结构和新库一致 INSERT INTO [dbo].[Bind] (ModuleID, MessageID) SELECT ModuleID, MessageID FROM [OldDatabase].[dbo].[Bind];
注意:如果新旧库的自增ID不匹配
如果旧库的ModuleID/MessageID和新库的不一样(因为自增ID是重新生成的),但表中的Name字段是唯一且一致的,可以通过Name字段来映射关联关系:
INSERT INTO [dbo].[Bind] (ModuleID, MessageID) SELECT m_new.ModuleID, msg_new.MessageID FROM [OldDatabase].[dbo].[Bind] b_old -- 关联旧库和新库的Module表,通过Name匹配 JOIN [OldDatabase].[dbo].[Module] m_old ON b_old.ModuleID = m_old.ModuleID JOIN [dbo].[Module] m_new ON m_old.Name = m_new.Name -- 关联旧库和新库的Message表,通过Name匹配 JOIN [OldDatabase].[dbo].[Message] msg_old ON b_old.MessageID = msg_old.MessageID JOIN [dbo].[Message] msg_new ON msg_old.Name = msg_new.Name;
关键提醒
执行插入前一定要确认:
- 所有要插入的
ModuleID在新库的Module表中已经存在 - 所有要插入的
MessageID在新库的Message表中已经存在
不然会触发外键约束报错哦!
内容的提问来源于stack exchange,提问作者Mady




