【问题标题】:SQL Server Bulk Insert Skip Primary Key ViolationsSQL Server 批量插入跳过主键冲突
【发布时间】:2016-12-09 16:58:33
【问题描述】:

我目前正在使用 SQL Server 的本机 Bulk Insert 过程将多个表从文本文件加载到数据库中。

这一直运行良好,甚至可以优雅地处理截断、null 和格式错误。如果任何列太大,不应该为空,或者根据格式文件找到的列数不正确,则会跳过这些行并将其转发到错误文件。

然而,最近在我的一个文本文件中输入了一个重复的主键。这导致批量插入失败,没有行被转发到错误文件。

目前我的批量插入命令如下所示:

BULK INSERT table.table FROM 'data_file.txt' WITH(
    BATCHSIZE = 100000,
    CODEPAGE = 1252,
    DATAFILETYPE = 'char',
    FIRSTROW = 2,
    KEEPNULLS,
    MAXERRORS = 1000000000,
    TABLOCK,
    FORMATFILE = 'format_file.txt',
    ERRORFILE = 'error_file.txt'
)

有没有办法使用批量插入来处理主键违规,就像处理其他错误一样?理想情况下,我希望将包含 PK 违规的行转发到同一个错误文件。

【问题讨论】:

    标签: sql sql-server tsql bulkinsert


    【解决方案1】:

    要直接回答您的问题,

    UNIQUE 和 PRIMARY KEY 约束始终强制执行。导入到使用 NOT NULL 约束定义的字符列时,当文本文件中没有值时,BULK INSERT 会插入一个空白字符串。

    我建议您使用暂存表或临时表进行批量插入并将其从那里移动到实际表中。

    BULK INSERT 不带 CHECK_CONSTRAINTS 选项还会对您的表产生其他影响:

    CHECK_CONSTRAINTS

    指定在大容量导入操作期间必须检查目标表或视图上的所有约束。如果没有 CHECK_CONSTRAINTS 选项,任何 CHECK 和 FOREIGN KEY 约束都会被忽略,并且在操作之后,表上的约束会被标记为不可信。

    如果你不fix it之后可以negatively impact performance查询。

    【讨论】:

    • 我在 MSDN 文档中看到了这句话,但不确定是否有独特的解决方法。我没有看到有人直接问过这个问题,所以希望将来如果他们发现自己处于相同的情况下,这可以帮助其他人。检查约束是我计划启用的,感谢您的建议。
    • 这是一个合理的问题,还有其他方法可以实现相同的目标,但据我所知,BULK INSERT 不是这样。祝@NightTrain 好运!
    • 在任何情况下,我都不会将数据直接导入生产表。我们不仅使用一个临时表,我们使用两个。一个包含来自文件的所有数据,另一个包含将进入 prod 的转换数据。这使得研究数据导入产生的问题变得更加容易(我们只需一个查询就可以知道麻烦的数据是来自我们的转换还是来自客户端),尤其是当您拥有数百万行文件时只需轻松打开和搜索。
    • 如果是这种情况,我只需从表中删除主键,并使用一个查询来检查重复项,同时使用错误文件来查找数据问题。 @NightTrain
    • 这是当前的行动计划。多谢你们。 @SqlZim
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多