2013-02-25 4 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'을 위반합니다.

id Name 
1 A 
2 B 
3 C 

tabel 객체에 'dbo.A'

을 중복 키를 삽입하고 나는 모든 행이 기본 키에 대해 다른 값을 가져야

id Name 
4 A 
5 B 
6 C 
+3

그것을 이미 테이블에있는 값을 삽입한다는 것입니다. 표 형식으로 일부 레코드를 제공 할 수 있습니까? 또는 당신이하려는 일에 대해 조금 더 설명 할 수 있습니다. –

+0

기본 키는 고유해야합니다. –

+0

왜 'INSERT'와 'SELECT'를 제공합니까? 이것 하나 (!) 쿼리입니까? –

답변

3

을 삽입 할 수 없습니다 기둥. A의 레코드를 다시 삽입하기 때문에 이미 사용중인 기본 키 값을 사용하여 새 레코드를 만들려고합니다. 이로 인해 표시되는 오류 메시지가 나타납니다.

레코드를이 방식으로 삽입해야하는 경우 고유 한 값을 PK 컬럼에 포함시키기위한 전략을 포함해야합니다. autoincrement 규칙 (일반적인 방법)을 사용할 수 없다면 논리가이 요구 사항을 적용해야합니다. 그렇지 않으면 계속 이와 같은 오류가 표시됩니다.

+0

죄송합니다. 기본 키를 자동 증가로 조정하고 싶지 않습니다. 다른 옵션이 있습니다. – enigma

+0

PK 필드를 조정하지 않으려면 괜찮습니다. 그러나 이것이 당신이 당신이 물어 본 오류를받는 이유입니다. –

2

테이블 A에서 선택하고 곧바로 다시 삽입합니다. 이것은 당신이 삽입 한 ID 값이 확실히 거기에 있음을 의미합니다.

메시지에 ID col에 PrimaryKey가 있고 메시지의 열에 고유 한 값이 필요하다는 메시지가 표시됩니다. 그것은 당신이 이런 이유로 행동을하도록 내버려 두지 않을 것입니다.

Yaakov 엘리스가 말한 것처럼
insert into A (id,Name) 
select ti.id + 3,ti .Name 
from A ti 
where ti.id >= 1 AND ti.id<=3 
0

이 ...

모든 행이 차에 대해 다른 값이 있어야합니다 :

, 당신의 명시된 요구 사항을 기반으로 쿼리를 해결하기 위해 스크립트를 변경하려면 키 열.

그리고 당신은 이제까지

총 3에있는 사람을 당신의 행을 수축 WHERE 절을 가지고 고유 ID의 1, 2, 그래서 당신은 트링 후 오히려 사람들을 바꾸려면 3

이미 존재하는 곳을 INSERT하고 오류를 생성합니다.

어쩌면 대신 업데이트 할 수 있습니까? 그러면 문제가 해결됩니다. 추가 코드의 당신을 첨가 한 후 UPDATE

... 당신은 ID 번호가 아니라 (당신이 그것을 불렀다 무엇이든) ABC 방송의 필드 이름

1

당신이 필요로 UNIQUE 키 식별자를 설정해야합니다 삽입하려는 행의 ID를 조정하십시오.

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

을하지만 현실에서 당신은 아마도 가능한 이전 키에서 분리하여 새 키를 유지하는 값을 선택해야합니다 : 귀하의 예에서 키 4, 5, 6을 생산하는

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