[sql-server] 프로그래밍 방식으로 ID 열 값을 변경하는 방법은 무엇입니까?

Testcolumn 이있는 테이블이있는 MS SQL 2005 데이터베이스가 ID있습니다. IDID 열입니다.

이 테이블에 행이 있고 모든 해당 ID 자동 증분 값이 있습니다.

이제이 표의 모든 ID를 다음과 같이 변경하고 싶습니다.

ID = ID + 1

그러나이 작업을 수행하면 오류가 발생합니다.

ID 열 ‘ID’를 업데이트 할 수 없습니다.

나는 이것을 시도했다 :

    ALTER TABLE Test NOCHECK CONSTRAINT ALL
    set identity_insert ID ON

그러나 이것은 문제를 해결하지 못합니다.

이 열에 ID를 설정해야하지만 때때로 값을 변경해야합니다. 그래서 내 질문은이 작업을 수행하는 방법입니다.



답변

당신은 필요

set identity_insert YourTable ON

그런 다음 행을 삭제하고 다른 ID로 다시 삽입하십시오.

삽입을 완료하면 identity_insert를 끄는 것을 잊지 마십시오

set identity_insert YourTable OFF


답변

IDENTITY 열 값은 변경할 수 없습니다.

그러나 테이블 메타 데이터를 전환하여 IDENTITY속성 을 제거 하고 업데이트를 수행 한 다음 다시 전환 할 수 있습니다.

다음 구조를 가정

CREATE TABLE Test
(
ID INT IDENTITY(1,1) PRIMARY KEY,
X VARCHAR(10)
)

INSERT INTO Test
OUTPUT INSERTED.*
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'

그럼 넌 할 수있어

/*Define table with same structure but no IDENTITY*/
CREATE TABLE Temp
(
ID INT PRIMARY KEY,
X VARCHAR(10)
)

/*Switch table metadata to new structure*/
ALTER TABLE Test SWITCH TO Temp;

/*Do the update*/
UPDATE Temp SET ID = ID + 1;

/*Switch table metadata back*/
ALTER TABLE Temp SWITCH TO Test;

/*ID values have been updated*/
SELECT *
FROM Test

/*Safety check in case error in preceding step*/
IF NOT EXISTS(SELECT * FROM Temp)
    DROP TABLE Temp /*Drop obsolete table*/

SQL Server 2012에서는 자동 증분 열을 사용하여보다 간단하게 업데이트 할 수도 있습니다. SEQUENCES

CREATE SEQUENCE Seq
    AS INT
    START WITH 1
    INCREMENT BY 1

CREATE TABLE Test2
(
ID INT DEFAULT NEXT VALUE FOR Seq NOT NULL PRIMARY KEY,
X VARCHAR(10)
)

INSERT INTO Test2(X)
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'

UPDATE Test2 SET ID+=1


답변

SQL Server 2005 관리자의 UI를 통해 열을 변경하여 열의 자동 번호 (ID) 속성을 제거합니다 (테이블을 마우스 오른쪽 버튼으로 클릭하여 선택하고 “디자인”선택).

그런 다음 쿼리를 실행하십시오.

UPDATE table SET Id = Id + 1

그런 다음 autonumber 속성을 다시 열에 추가하십시오.


답변

먼저 해당 문제에 대한 IDENTITY_INSERT 설정을 켜거나 끄면 필요한 값에 맞지 않습니다 (플러그 갭과 같은 새 값을 삽입하는 데 사용됨).

GUI를 통해 작업을 수행하면 임시 테이블이 생성되고 ID 필드없이 모든 데이터가 새 테이블에 복사되고 테이블 이름이 바뀝니다.


답변

임시 테이블을 사용하여 수행 할 수 있습니다.

아이디어

  • 제약 조건 비활성화 (ID가 외래 키로 참조되는 경우)
  • 새 ID로 임시 테이블을 만듭니다.
  • 테이블 내용을 삭제
  • 복사 한 테이블에서 원래 테이블로 데이터를 다시 복사
  • 사전에 비활성화 된 제약 조건 활성화

SQL 쿼리

하자가 당신의 말을 test테이블에 두 개의 추가 열 (가 column2column3)과 2 개를 참조하는 외래 키를 가진 테이블이 있다고 test이라고 foreign_table1하고 foreign_table2(실제 문제는 간단한 적이 없기 때문에).

alter table test nocheck constraint all;
alter table foreign_table1 nocheck constraint all;
alter table foreign_table2 nocheck constraint all;
set identity_insert test on;

select id + 1 as id, column2, column3 into test_copy from test v;
delete from test;
insert into test(id, column2, column3)
select id, column2, column3 from test_copy

alter table test check constraint all;
alter table foreign_table1 check constraint all;
alter table foreign_table2 check constraint all;
set identity_insert test off;
drop table test_copy;

그게 다야.


답변

DBCC CHECKIDENT ( ‘databasename.dbo.orders’, RESEED, 999)이 명령으로 ID 열 번호를 변경할 수 있으며 원하는 모든 숫자에서 해당 필드 번호를 시작할 수 있습니다. 예를 들어 내 명령에서 시작을 요청합니다. 1000 (999 + 1)이면 충분할 것입니다 … 행운


답변

열이 PK가 아닌 경우 항상 증가 된 숫자로 테이블에 새 열을 작성하고 원본을 제거한 다음 새 열을 이전 열로 변경할 수 있습니다.

왜이 작업을 수행 해야하는지 궁금합니다 … Identity 열로 퍼트해야했던 대부분은 숫자를 채우는 것이었고 DBCC CHECKIDENT (tablename, RESEED, newnextnumber)를 사용했습니다.

행운을 빕니다!