Нарушение SQL Server ограничения PRIMARY KEY 'PK - PullRequest
2 голосов
/ 11 ноября 2011

Я получаю эту ошибку при проверке журналов своего приложения:

[Базы данных] Исключение: dbi.integrity-error, [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Нарушение ограничения PRIMARY KEY 'PK__tblRaw201131411__13D55980'.Невозможно вставить повторяющийся ключ в объект «dbo.tblRaw201131411».в EXEC

[Базы данных] Исключение: dbi.integrity-error, [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Нарушение ограничения PRIMARY KEY 'PK__tblRaw201131412__407DE2C5'.Невозможно вставить повторяющийся ключ в объект 'dbo.tblRaw201131412'.в EXEC

Файл "mssqlinterface.py", строка 951, в executeSQLStatement

Как исправить эту ошибку?

Мое приложение использует SQL Server 2005 База данных.

Ответы [ 5 ]

6 голосов
/ 11 ноября 2011

Вы можете исправить эту ошибку, не пытаясь вставить строки с повторяющимся первичным ключом.

Как вы делаете это, во многом зависит от вашего приложения, детали которого у вас нетне предоставлено (строки с 900 по 960 mssqlinterface.py было бы хорошим началом со специальным маркером на строке 951).

Возможно, вы пытаетесь вставить, когда нужно обновить.Возможно, код, который устанавливает значение первичного ключа, в некотором роде несовершенен.

Возможности буквально (и я имею в виду это в очень переносном смысле), бесконечны.

0 голосов
/ 20 сентября 2013

Похоже, что вы пытаетесь импортировать файл с дублирующимися записями. Обычно я импортирую их в промежуточную таблицу и выполняю очистку данных, чтобы избавиться от них перед импортом в рабочую таблицу. Вы также можете удалить дубликаты записей через поток данных служб SSIS. Наиболее важно выяснить, почему в файле есть повторяющиеся записи и что это означает с точки зрения модели данных, в которую вы пытаетесь импортировать. Например, предположим, что вы импортировали список торговых представителей, у каждого из которых есть территория. Предположим, что ваша таблица считает terrtory уникальной и, таким образом, сделала ее PK. Затем вы получаете нового клиента и получаете ошибку PK, потому что у них есть два представителя, которые разделяют территорию. Простое удаление записей не принесет вам никакой пользы (эти представители не смогут получить доступ к вашей системе), теперь вам нужно исправить приложение, чтобы обрабатывать представителей, которые делят территории. В другом случае может оказаться, что они забыли удалить запись о человеке, которого больше нет, и вы можете попросить фиксированный файл и счастливо продолжить ваш текущий процесс.

0 голосов
/ 20 сентября 2013

Была такая же ошибка. Столбец идентичности не гарантирует уникальность идентификаторов. Вот некоторый код для воспроизведения ошибки и возможное решение:

CREATE TABLE atest (id INT NOT NULL IDENTITY(1,1) PRIMARY KEY , val VARCHAR(10));

insert atest values ('a')
insert atest values ('b')
insert atest values ('c')
insert atest values ('d')
insert atest values ('e')

delete atest  where id < 4

select * from atest
--4 d
--5 e

DBCC CHECKIDENT ('atest', RESEED, 0);

insert atest values ('aa')
insert atest values ('bb')
insert atest values ('cc')

select * from atest
--1 aa
--2 bb
--3 cc
--4 d
--5 e

-- Here comes the error!
insert atest values ('dd')
-- Oops!


-- Here's the Solution:
DBCC CHECKIDENT ('atest', RESEED);

-- Try again...
insert atest values ('dd')

select * from atest
--1 aa
--2 bb
--3 cc
--4 d
--5 e
--6 dd

--All good!
0 голосов
/ 11 ноября 2011

Поскольку это нарушение первичного ключа, вы пытаетесь вставить что-то, что сделает данные, используемые первичным ключом, не уникальными.

1) Вы можете просто не делать этого, убедитесь, что вы не добавляете повторяющиеся данные ПК

2) Возможно, вам необходимо обновить первичный ключ, чтобы он стал составным ключом (ключ использует 2 или более столбцов), чтобы данные, используемые PK, могли быть уникальными.

3) Если вы вручную вводите данные, которые используете в качестве своего ПК, возможно, добавьте в эту таблицу еще один столбец с именем ID (если это необходимо) и установите его для автоматического увеличения, затем сделайте этот ПК своим, поэтому ваш ПК всегда будет уникальный.

4) Удалить ПК (это вообще очень плохая идея)

Без дополнительных данных действительно трудно предложить решение, но на первый взгляд я бы предложил эти 4 варианта.

0 голосов
/ 11 ноября 2011

не вставляйте одно и то же значение в столбец первичного ключа дважды ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...