我最终放弃了约束,并使用公共表表达式删除了重复项。
下面是我使用的SQL:
-- drop unique constraint
ALTER TABLE [dbo].[SegmentParcels] DROP CONSTRAINT [uc_SegmentID_ParcelID]
GO
-- update segment ids to new values from map
update SegmentParcels
set segmentID = [newID] from newsegments where segmentID = currentid
GO
-- use common table expression to delete duplicates
WITH Duplicates(SegmentID, ParcelID, Id)
AS
(
SELECT SegmentID, ParcelID, Min(Id) Id
FROM SegmentParcels
GROUP BY segmentID, parcelID
HAVING Count(*) > 1
)
DELETE FROM SegmentParcels
WHERE Id IN (
SELECT SegmentParcels.Id
FROM SegmentParcels
INNER JOIN Duplicates
ON SegmentParcels.segmentID = Duplicates.SegmentID
AND SegmentParcels.parcelID = Duplicates.ParcelID
AND SegmentParcels.Id <> Duplicates.Id
)
-- add unique constraint back
ALTER TABLE [dbo].[SegmentParcels] ADD CONSTRAINT [uc_SegmentID_ParcelID] UNIQUE NONCLUSTERED
(
[segmentID] ASC,
[parcelID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO