我在SQL数据库中有一个表,它有两个字段 Random (主键而非null)和 Count (Identity增加1)。我必须在Random字段中插入十亿条记录。我能够一次插入1000行,因为这是SQL Insert语句可以处理的最大值(在使用ADO.NET的C#控制台应用程序中)。
我想要插入的数据是随机的但不是唯一的。所以,我一直得到例外"违反主键...."。正在删除所有1000行,而不是只删除重复的值。
是否可以通过仅删除重复值而不是插入语句中的所有记录(在我的情况下为1000)来插入唯一值?
我也尝试使用DataTable和SQLBulkCopy来插入值但没有成功。
示例场景:TableA
随机计数
100 1
101 2
插入(随机)TableA值(102),(103),(100),(104),(105),(101)
100和101是重复值。有没有办法只删除这些值(100,101)并插入所有其他值(102,103,104,105)? (在我的程序中,由于主键违规而丢弃了所有值)
对此非常感谢。
由于
答案 0 :(得分:0)
您可以尝试使用IGNORE_DUP_KEY标志。从Random中删除PrimaryKey并添加UNIQUE约束,如下所示:
ALTER TABLE dbo.TableA
ADD CONSTRAINT UniqueRandomValue
UNIQUE (Random) WITH (IGNORE_DUP_KEY = ON);
SQL server - stored procedure - ignore exception
另一种选择是编写自己的逻辑来避免或处理冲突。我建议对这种情况使用存储过程,以防止重复的数据库连接。发送一批数据作为参数,并在存储过程中逐个插入,忽略冲突。小心限制批量大小以避免连接超时。动态减小批量大小证明对于从数据大小导致的超时反弹非常有用。
BEGIN TRY
INSERT INTO TableA(Random) VALUES(@val);
END TRY
BEGIN CATCH
END CATCH;