2011-05-04 2 views
0

나는 이런 식으로 뭔가를 할 :열 T를 나열하지 않고 기본 키 오류없이 표 T에서 행 T 사본을 삽입 할 수 있습니까?

INSERT INTO T SELECT * FROM T WHERE Column1 = 'MagicValue' -- (multiple rows may be affected) 

문제는 T 기본 키 열이 있다는 것입니다 및 기본 키를 설정하려고 것처럼 그래서 이것은 오류가 발생합니다. 그리고 솔직히 기본 키를 설정하고 싶지 않습니다. 새 기본 키를 사용하여 완전히 새로운 행을 만들고 나머지 필드는 원래 행에서 복사하려고합니다.

다양한 테이블에 적용 할 수있는 제네릭 코드입니다. 음, 이렇게하는 좋은 방법이 없다면, 나는 동적으로 열 이름을 추출하고리스트를 구성하는 코드를 작성할 것입니다.하지만 아마도 그럴 수 있습니다. 데이터베이스 또는 다른 것에 중복 행을 만들려고하는 첫 번째 사람입니까?

+2

어떤 상황에서도 select * !!!!!를 사용하여 삽입구를 작성해야합니까? 그것은 단지 일어날 기다리고있는 버그 일뿐입니다. 이것에 대한 좋은 일반적인 코드가 없기 때문에 하나 이상의 테이블에 유용하게 쓰일 인서트 스타트먼트를 작성하는 것은 적절하지 않습니다. 모든 쿼리에서 항상 필요한 열을 지정하는 것이 좋습니다. 프로덕션 코드에서 성능 문제를 일으키고 나쁜 버그를 유발하므로 SELECT *를 사용할 수 없습니다. – HLGEM

+0

어떤 DBMS입니까? –

답변

0

"기본 키"로 가정하면 자동 할당 또는 자동 증가하는 데이터 유형이 identity 또는 guid입니다.

매우 멋진 동적 SQL이 없으면 사용자가 수행 한 작업을 수행 할 수 없습니다. ID 필드 이외의 모든 것을 삽입하려면 필드를 지정해야합니다. 해당 필드의 값을 지정하려면

, 당신은 SELECTIDENTITY_INSERTINSERT 차례로 모든 필드를 지정해야합니다.

+0

나는 밝은 생각이 JNK의 코멘트를 downvote했다는 것을 이해하지 못한다. 나는 그것을 upvoting입니다. – EndangeringSpecies

+0

@ 위험한 행동 -별로 큰 문제가 아니므로 SO가 함께 제공됩니다. 이 질문에 대한 답변이 제공됩니까? 너는 정체성을 말하는거야? – JNK

0

데이터베이스의 행을 복제하는 데 아무런 이득이 없습니다 (기본 키를 설정하지 않은 경우). 그것은 현명 할 것이고 "양"이라고 불리는 또 다른 칼럼을 갖는 문제를 피할 것입니다.

뭔가

UPDATE T SET Amount = Amount + 1 WHERE Column1 = 'MagicValue' 

같은하거나 반환 필드의 양처럼 1 개 이상 증가 할 수있는 경우

Update T SET Amount = Amount * 2 WHERE Column1 = 'MagicValue' 

난 당신이 정확하게 만하면 뭘 하려는지 모르겠어요 당신이하고있는 일을 위의 작동하지 않습니다 귀하의 디자인에 새 테이블이 필요하고 거기에 삽입 생각합니다.

편집 : 귀하의 의견 아래에 언급 된 바와 같이 제네릭 삽입물은 실제로 의미가 없습니다. 이 작업을 수행하려면 동일한 수의 필드가 필요하며 동일한 값을 보유해야합니다 (필요하지 않더라도 동일한 이름을 사용해야 함). 기본적으로 두 번 같은 테이블 구조가됩니다.

관련 문제