【问题标题】:Using C#: Insert multiple values (not unique) into a field (Primary Key) in SQL database table?使用 C#:将多个值(不唯一)插入 SQL 数据库表中的字段(主键)?
【发布时间】:2012-05-11 13:54:51
【问题描述】:

我在 SQL 数据库中有一个表,它有两个字段 Random(主键且不为空)和 Count(身份递增 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)? (在我的程序中,由于主键违规,所有值都被删除了)

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

谢谢

【问题讨论】:

    标签: database c#-4.0 insert sql-server-2008-r2


    【解决方案1】:

    您可以尝试使用 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多