【问题标题】:Primary key violation on trivial BCP insert琐碎 BCP 插入的主键违规
【发布时间】:2011-11-16 16:33:40
【问题描述】:

我正在 SQL Server 2008 Express 上试用 BCP 实用程序。我不认为我正在尝试做的事情可能更微不足道,但在尝试将两行插入空表时,我仍然遇到主键冲突。

这是 DDL 表:

CREATE TABLE [dbo].[BOOKS](
    [BOOK_ID] [numeric](18, 0) NOT NULL,
    [BOOK_DESCRIPTION] [varchar](200) NULL,
CONSTRAINT [BOOKS PK] PRIMARY KEY CLUSTERED 
(
[BOOK_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

这是BCP格式文件:

10.0
2
1       SQLNUMERIC          0       3     "\t"     1     BOOK_ID                              ""
2       SQLCHAR             0       0     "\r\n"   2     BOOK_DESCRIPTION                     Modern_Spanish_CI_AS

这是我的输入文件:

101 BOOK_ABC_001<CR><LF>
102 BOOK_ABC_002<CR><LF>

最后是我运行的命令:

bcp Database.dbo.BOOKS in books.txt -T -f BOOKS-format.fmt

这是我得到的错误:

Starting copy...
SQLState = 23000, NativeError = 2627
Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Violation of PRIMARY KEY  constraint 'BOOKS PK'. Cannot insert duplicate key in object 'dbo.BOOKS'.
SQLState = 01000, NativeError = 3621
Warning = [Microsoft][SQL Server Native Client 10.0][SQL Server]The statement has been terminated.

BCP copy in failed

现在,如果我使用单行的输入文件,BCP 就会成功。在这种情况下,BOOK_ID 列的值被分配为 0。所以似乎我的输入文件中的第一个字段被忽略了,并且 0 被用作所有行的 BOOK_ID 的值,这可以解释 PK 违规错误。

所以问题是,我的格式或输入文件有什么问题导致第一列被忽略?

谢谢。

【问题讨论】:

  • 好吧,我通过使用格式描述符的 XML 版本解决了这个问题,如下所示:&lt;?xml version="1.0"?&gt; &lt;BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt; &lt;RECORD&gt; &lt;FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t"/&gt; &lt;FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" COLLATION="Modern_Spanish_CI_AS"/&gt; &lt;/RECORD&gt; &lt;ROW&gt; &lt;COLUMN SOURCE="1" NAME="BOOK_ID" xsi:type="SQLNUMERIC" PRECISION="18" SCALE="0"/&gt; &lt;COLUMN SOURCE="2" NAME="BOOK_DESCRIPTION" xsi:type="SQLVARYCHAR"/&gt; &lt;/ROW&gt; &lt;/BCPFORMAT&gt;
  • 无论如何,如果有人对非 xml 格式文件的问题有答案,我将不胜感激......谢谢。

标签: sql-server-2008 bcp


【解决方案1】:

我从未见过数据类型为 DEC 的主键列,不确定小数是否有效。我一直使用整数。 但我认为问题是 PK 列没有设置身份,所以当它添加新行时它不会自动递增。在您的表创建代码中,替换:

[BOOK_ID] [数字](18, 0) 非空, 和 [BOOK_ID] [int] IDENTITY(1,1) NOT NULL,

干杯

【讨论】:

  • 嗯,看来关键是要把PK列设置为identity。我看到了这个link,它谈到了数字PK,所以我按照你的建议重新创建了表格,但也像CREATE TABLE [dbo].[BOOKS]( [BOOK_ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL, [BOOK_DESCRIPTION] [varchar](200) NULL, CONSTRAINT [BOOKS PK] PRIMARY KEY CLUSTERED ( [BOOK_ID] ASC )WITH ... 一样,bcp 很高兴使用纯文本格式插入行。我仍然不明白为什么它使用 XML 格式工作。
猜你喜欢
  • 2018-10-25
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2016-01-12
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多