Test
column 이있는 테이블이있는 MS SQL 2005 데이터베이스가 ID
있습니다. ID
ID 열입니다.
이 테이블에 행이 있고 모든 해당 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
테이블에 두 개의 추가 열 (가 column2
와 column3
)과 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)를 사용했습니다.
행운을 빕니다!