1

我在 SQL 数据库中有一个表,它有两个字段随机(主键和非空)和计数(身份递增 1)。我必须在 Random 字段中插入十亿条记录。我能够一次插入 1000 行,因为这是 SQL Insert 语句可以处理的最大值(在使用 ADO.NET 的 C# 控制台应用程序中)。

我试图插入的数据是随机的,但不是唯一的。所以,我得到了例外“违反主键......”。不是只删除重复值,而是删除所有 1000 行。

是否可以通过仅删除重复值而不是插入语句中的所有记录(在我的情况下为 1000)来插入唯一值?

我也尝试使用 DataTable 和 SQLBulkCopy 插入值但没有成功。

示例场景:TableA

随机计数

100 1

101 2

插入(随机)表A值(102),(103),(100),(104),(105),(101)

100 和 101 是重复值。有没有办法只删除这些值(100,101)并插入所有其他值(102,103,104,105)?(在我的程序中,所有值都因违反主键而被删除)

非常感谢您对此的任何帮助。

谢谢

4

1 回答 1

0

您可以尝试使用 IGNORE_DUP_KEY 标志。从 Random 中删除 PrimaryKey 并添加一个 UNIQUE 约束,如下所示:

 ALTER TABLE dbo.TableA
   ADD CONSTRAINT UniqueRandomValue
   UNIQUE (Random) WITH (IGNORE_DUP_KEY = ON);

SQL Server - 存储过程 - 忽略异常

另一种选择是编写自己的逻辑来避免或处理冲突。我建议在这种情况下使用存储过程,以防止重复的数据库连接。发送一批数据作为参数,并在存储过程中一个一个地插入,忽略冲突。小心限制批量大小以避免连接超时。动态减小批量大小被证明对于从数据大小引起的超时中反弹很有用。

BEGIN TRY
INSERT INTO TableA(Random) VALUES(@val);
END TRY
BEGIN CATCH
END CATCH;
于 2012-05-11T15:04:56.717 回答