Нарушение первичного ключа на тривиальной вставке BCP
Я пробую утилиту BCP на SQL Server 2008 Express. Я не думаю, что то, что я пытаюсь сделать, может быть более тривиальным, но все же я получаю нарушение первичного ключа при попытке вставить две строки в пустую таблицу.
Вот таблица 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 ошибка.
Итак, вопрос в том, что не так в моем формате или входных файлах, что приводит к игнорированию первого столбца?
Благодарю.
1 ответ
Я никогда не видел столбец первичного ключа с типом данных DEC, не уверен, что десятичные дроби работают. Я всегда использовал целое число. Но я думаю, что проблема в том, что в столбце PK нет идентификатора, поэтому при добавлении новой строки он не увеличивается автоматически. В вашей таблице создайте код, замените:
[BOOK_ID] [числовой](18, 0) NOT NULL, с [BOOK_ID] [int] IDENTITY(1,1) NOT NULL,
ура