如何用T-SQL将一对多数据迁移至多对多StaffClient关联表?
问题:Client表一对多转多对多的数据迁移
原Client表为一对多关系(一名Staff对应多名Client),ClientId为主键,StaffId为外键。现因需求变更需改为多对多关系,需将Client表中关联数据迁移至已包含1000+行数据的StaffClient关联表。
现有数据与表结构
Client表数据
ClientId StaffId ---------------------------------------------------------------------------- F7DD6029-27AF-A9ED-57A2-FE25B815BFA7 3AA1C003-F0F1-49AB-84A3-26E747EE4581 1CB8FE0F-2D21-4E5B-99E9-FBBDF0EEBDC7 3AA1C003-F0F1-49AB-84A3-26E747EE4581 D87659C2-7916-4048-A165-F4BB0B4937D3 NULL E18E3C8D-92DB-4627-BB73-F43CB67A3AEE NULL 50795DB2-085E-46FD-97DE-F33B6AE39EE0 NULL 45FE2A69-583F-CBF7-750A-E9C93FC52D27 NULL 86B13CB5-41DB-4016-8D3D-E467B0CD6EE9 NULL 24508726-61CE-4C27-B6D7-DBABBAAD141B 8E3990F4-68B7-4F0F-AD40-923ECAC7A476 66FDFC91-1E27-4AEE-A8F6-D79B54CF601D NULL A99A0D77-612F-47B7-A82B-D0E51ADF1E49 NULL 59388388-5AEC-4AC5-BD54-CF802734AAD1 B7B0897A-8D40-408E-841B-598C3C425762 79747776-5867-458F-8FD5-CDD299AA3595 NULL F5A8EFF1-3996-424C-9EF8-CD60D0B900DE 3AA1C003-F0F1-49AB-84A3-26E747EE4581
StaffClient关联表建表语句
CREATE TABLE StaffClient ( StaffId uniqueidentifier, ClientId uniqueidentifier PRIMARY KEY (StaffId, ClientId), FOREIGN KEY (StaffId) REFERENCES Staff(StaffId), FOREIGN KEY (ClientId) REFERENCES Client(ClientId) );
迁移T-SQL语句
INSERT INTO StaffClient (StaffId, ClientId) SELECT c.StaffId, c.ClientId FROM Client c WHERE c.StaffId IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM StaffClient sc WHERE sc.StaffId = c.StaffId AND sc.ClientId = c.ClientId );
关键说明
- 过滤NULL值:只迁移有明确Staff关联的Client数据,无关联的Client(StaffId为NULL)无需进入多对多关联表。
- 避免重复插入:通过
NOT EXISTS检查StaffClient中是否已存在该Staff-Client组合,防止违反联合主键约束。 - 数据完整性保障:外键约束会自动验证插入的StaffId和ClientId是否分别存在于Staff表和Client表中,确保数据合法性。
内容的提问来源于stack exchange,提问作者CodeMan03
相关产品推荐
相关产品推荐

