所以我有张桌子:
CREATE TABLE [Snapshots].[Crashproof](
[EmoteCountId] [int] IDENTITY(1,1) NOT NULL,
[SnapshotId] [int] NOT NULL,
[Emote] [nvarchar](42) NOT NULL,
[EmoteCountTypeId] [int] NOT NULL,
[Count] [decimal](19, 6) NOT NULL,
CONSTRAINT [PK_SnapshotsCrashproof] PRIMARY KEY CLUSTERED ([EmoteCountId] ASC) ON [PRIMARY],
CONSTRAINT [FK_SnapshotsCrashproof_Snapshots] FOREIGN KEY ([SnapshotId]) REFERENCES [Snapshots].[Snapshots] ([SnapshotId]) ON DELETE CASCADE,
CONSTRAINT [FK_SnapshotsCrashproof_EmoteCountTypes] FOREIGN KEY ([EmoteCountTypeId]) REFERENCES [dbo].[EmoteCountTypes] ([EmoteCountTypeId])
) ON [PRIMARY]
GO而插入到其中的代码:
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, trans))
{
bulkCopy.DestinationTableName = "Snapshots.Crashproof";
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("SnapshotId", "SnapshotId"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("EmoteCountTypeId", "EmoteCountTypeId"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Emote", "Emote"));
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Count", "Count"));
using (IDataReader reader = ObjectReader.Create(emoteCountTypesToSnapshot))
{
bulkCopy.WriteToServer(reader);
}
}它在99.99%的时间内运行良好(每分钟完成一次大容量复制),但是有一次出现了异常,它位于最后一行(bulkCopy.WriteToServer(reader);)上:
违反主键constraint...Cannot在对象‘Snapshots.Crash防’中插入重复密钥。重复键值为(247125)。
我知道不建议在最后一个表中直接插入大容量,我将修改我的代码,将其大容量插入到一个暂存表中,然后从那里插入。但这是导致这一例外的原因吗?
我真的不明白一个重复的键怎么会出现在一个标识字段上:
发布于 2016-09-29 17:53:52
我的建议是使用ETL产品来完成这些任务。他们为你组织了一切,做了这么干净的工作。乱搞散装拷贝和存储过程,制作分期表(我做了很多年了),现在对我来说实在是太丑了。
在过去的几年里,我一直在使用五旬节水壶,并且完全爱上了它。这个任务只需要几分钟,或者不到一分钟就能实现,并且完成从一个地方到另一个大堆中的所有正常移动/转换数据的工作。
我知道这不是对你问题的直接回答,但如果有人来找我问这个问题的话,这是我马上会建议的事情。
https://stackoverflow.com/questions/38875584
复制相似问题