2011-08-05 4 views
4

SQL 서버 테이블에 특정 위치에 행을 삽입하려고합니다. 예를 들어, 내 테이블에 100 개의 행이 있고 위치 9에 새 행을 삽입하고 싶습니다. 그러나 테이블에 대한 PK 인 ID 열은 이미 ID가 9 인 행을 가지고 있습니다.이 위치에 행을 삽입하면 어떻게됩니까? 다음 위치로 이동 한 후 행?특정 위치의 행에 삽입하여 PK로 SQL 서버 테이블에 삽입

답변

3

아니요, 새 행이 삽입되는 위치를 제어 할 수 없습니다. 사실, 귀하는 SELECT 진술 문에 ORDER BY 조항을 사용하여 결과를 원하는 방식으로 주문할 필요가 없습니다.

9

관계형 테이블에는 '위치'가 없습니다. 최적화으로 색인은 지정된 키별로 행을 정렬합니다. 키 순서의 특정 순위에 행을 삽입하려면 해당 순위 위치에 정렬하는 키와 함께 색인을 삽입하십시오.

UPDATE TABLE table SET ID += 1 WHERE ID >= 9; 
INSERT INTO TABLE (ID, ...) VALUES (9, ...); 

없이 가능하게 제정신이있을 수없고, 말할 : 귀하의 경우에 당신은 ID 이상 (8) 후, 1 ID를 증가 값 9 ID를 삽입 할 경우 값을 가진 모든 행을 업데이트해야합니다 그런 일을하는 이유. 정말로 그러한 요구 사항이 있다면, 두 개 (또는 그 이상)의 파트가있는 복합 키를 사용하십시오. 이러한 키를 사용하면 하위 키를 삽입하여 원하는 순서로 정렬 할 수 있습니다. 하지만 훨씬 더 가능성이 문제가 독점적으로 정확한 ORDER BY를 지정하여, 행의 물리적 순서로 엉망으로 해결할 수 있습니다.

기본 키의 의미를 다시 한번 생각해보십시오. 엔티티 수명 동안 변경되지 않는 엔티티의 식별자. 그런 다음 질문은 질문에 착오가 더 분명하게하는 방법으로 고쳐 할 수 있습니다

나는 몇 가지 새로운 값으로 ID 9 엔티티의 내용을 변경하고 싶습니다. 엔티티 9의 이전 값은 ID가 10 인 엔티티의 내용 으로 이동해야합니다. ID 10 인 엔티티의 이전 내용은 이 ID 11 ... 등으로 엔티티로 이동되어야합니다. 가장 오래된 ID를 가진 엔티티의 이전 콘텐츠는 새로운 엔티티로 삽입되어야합니다.

2

일반적으로 하지 마십시오 이렇게하면 기본 키를 사용하고 싶습니다. 더 나은 접근 방법은 자신의 주문 시스템을 추적 할 수있는 '위치'또는 이와 유사한 다른 열을 만드는 것입니다.

은이 같은 쿼리를 실행할 수있는 이동 수행하려면 : 당신의 열이 AUTO_INCREMENT 기능을 사용하는 경우

UPDATE table SET id = id + 1 WHERE id >= 9

이 작동하지 않습니다.

0

이러한 종류의 관계형 테이블의 목적을 위반하지만, 필요하다면 그렇게하는 것이 어렵지 않습니다.

1) ROW_NUMBER() OVER(ORDER BY NameOfColumnToSort ASC) AS Row을 사용하여 테이블의 행 번호 열을 만듭니다. 당신이 복사 할 수 있습니다 여기에서 (SELECT columnsYouNeed INTO를 사용

2)) 전과 두 개의 테이블에 테이블의 일부 후에는 (당신이 각각 WHERE Row < ##Row >= ## 문을 사용) 후 귀하의 값을 삽입 할 행 수에 따라.

3) 다음은 DROP TABLE을 사용하여 원본 테이블을 삭제합니다.

4) 그런 다음 앞에 테이블에 UNION, 삽입 할 행 (명시 적으로 정의 된 SELECT 문 하나만 사용) 및 after 테이블을 사용합니다. 지금까지 세 개의 개별 select 절에 대해 두 개의 UNION 문이 있습니다. 여기에 SELECT INTO FROM 절에서이를 원래 테이블의 이름이라고 부르기 만하면됩니다.

5) 마지막으로 DROP TABLE 두 테이블을 작성하십시오.

이것은 ALTER TABLE의 작동 방식과 유사합니다. MORE REF FOR

1
DECLARE @duplicateTable4 TABLE (id int,data VARCHAR(20)) 
INSERT INTO @duplicateTable4 VALUES (1,'not duplicate row') 
INSERT INTO @duplicateTable4 VALUES (2,'duplicate row') 
INSERT INTO @duplicateTable4 VALUES (3,'duplicate rows') 
INSERT INTO @duplicateTable4 VALUES (4,'second duplicate row') 
INSERT INTO @duplicateTable4 VALUES (5,'second duplicat rows') 
DECLARE @duplicateTable5 TABLE (id int,data VARCHAR(20)) 

insert into @duplicateTable5 select *from @duplicateTable4 
delete from @duplicateTable4 


declare @i int , @cnt int 
set @i=1 
set @cnt=(select count(*) from @duplicateTable5) 
while(@i<[email protected]) 
begin 
if @i=1 
begin 
insert into @duplicateTable4(id,data) select 11,'indian' 
insert into @duplicateTable4(id,data) select id,data from @duplicateTable5 where [email protected] 
end 
else 
insert into @duplicateTable4(id,data) select id,data from @duplicateTable5 where [email protected] 
set @[email protected]+1 
end 


    select *from @duplicateTable4 
이 코드는 다음에, 특정한 위치에 값을 삽입 할 수
+0

내가 설정 위치 = 새로운 로우 값은 행 1의 위치에 삽입 한 –