2013-02-25 2 views
1
insert into A (id,Name) 
select ti.id,ti .Name 
from A ti 
where ti.id >= 1 AND ti.id<=3 

id является основным ключом, но не автогенерирован. Когда я запускаю запрос, я получаю сообщение об ошибкеНе удается вставить дубликат ключа SQL

Нарушение ограничения PRIMARY KEY «XPKA». Невозможно вставить повторяющийся ключ в объект '' dbo.A

Tabel A

id Name 
1 A 
2 B 
3 C 

и я хочу, чтобы вставить

id Name 
4 A 
5 B 
6 C 
+3

It просто означает, что вы вставляете значение, которое уже существует в таблице. можете ли вы дать некоторые записи в табличном формате? или, может быть, вы можете объяснить немного больше о том, что вы пытаетесь сделать. –

+0

Первичные ключи должны быть уникальными –

+0

Почему вы даете нам «INSERT» и «SELECT»? Это один (!) Запрос? –

ответ

3

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

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

+0

жаль, что я не хочу настроить первичный ключ на автоинкремент. у вас есть другой вариант. – enigma

+0

, если вы не хотите настраивать поле PK, тогда это нормально. Но именно по этой причине вы получаете сообщение об ошибке, о которой вы спрашивали. –

2

Вы выбираете из таблицы A и вставляете обратно обратно к ней. Это означает, что значения идентификатора, которые вы вставляете, наверняка уже есть.

В сообщении говорится, что идентификатор col имеет PrimaryKey и требует, чтобы значения в столбце были уникальными. По этой причине он не позволит вам выполнить действие.

Чтобы исправить свой запрос на основе Ваших требований, измените сценарий:

insert into A (id,Name) 
select ti.id + 3,ti .Name 
from A ti 
where ti.id >= 1 AND ti.id<=3 
0

Как Яаков Эллис сказал ...

Каждая строка должна иметь различное значение для первичного Ключевая колонка.

И как у вас есть ИНЕКЕ, которая сужает ваши строки до 3 в общей сложности EVER

Те с уникальными идентификаторами 1, 2 и 3

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

Возможно, вы могли бы ОБНОВИТЬ их вместо этого? И это решит вашу проблему.

UPDATE

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

1

Вы должны отрегулируйте идентификатор строк, которые вы вставляете.В вашем примере для получения ключей 4, 5, 6:

insert into A (id,Name) 
select ti.id + 3 as NewKey,ti.Name 
from A ti 
where ti.id >= 1 AND ti.id<=3 

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

insert into A (id,Name) 
select ti.id + 100000 as NewKey,ti.Name 
from A ti 
where ti.id >= 1 AND ti.id<=3 
Смежные вопросы