ID 열 값을 프로그래밍 방식으로 변경하려면 어떻게 해야 합니까?
에는 MS SQL 2005 테이블이 .Test
" " " " " " 가 ID
ID
아이디 아이디입니다.
이 테이블에는 행이 있으며 모든 행에는 대응하는 ID 자동 증가 값이 있습니다.
이 표의 모든 ID를 다음과 같이 변경합니다.
ID = ID + 1
하지만 이렇게 하면 다음과 같은 오류가 발생합니다.
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
property, back, 데,, ,, 、 데 property 、 데 property 、 데 property property시 。
다음과 같은 구조를 전제로 한다.
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*/
수 자동 증분 컬럼을 수 .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에서 컬럼을 변경하여 컬럼의 autonumber(아이덴티티) 속성을 삭제합니다(테이블을 오른쪽 클릭하여 선택하고 "Design"을 선택합니다).
그런 다음 쿼리를 실행합니다.
UPDATE table SET Id = Id + 1
그런 다음 autonumber 속성을 다시 컬럼에 추가합니다.
먼저 ID_의 설정INSERT ON/OFF는 필요한 기능을 하지 않습니다(틈새 삽입 등 새 값을 삽입하는 데 사용됩니다).
GUI에서 조작을 실행하면 임시 테이블이 생성되고 ID 필드가 없는 새 테이블에 모든 데이터가 복사되어 테이블 이름이 변경됩니다.
이것은 임시 테이블을 사용하여 수행할 수 있습니다.
아이디어
- disable restraints (외부 키에 의해 ID가 참조되는 경우)
- 새 ID를 사용하여 임시 테이블을 만듭니다.
- 표 내용을 삭제하다
- 복사된 테이블에서 원래 테이블로 데이터 복사
- 미리 비활성화된 제약 조건 사용
SQL 쿼리
를 당신의 ★★★★★★★★★★★★★★★★★★★★★★★★★★.test
에는 두 컬럼이 되어 있습니다(열 2개).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가 아닌 경우 항상 증가된 숫자를 사용하여 테이블에 새 열을 생성하고 원래 열을 삭제한 다음 새 열을 이전 열로 변경할 수 있습니다.
왜 이런 일을 해야 하는지 궁금해서...지금까지 아이덴티티 컬럼에 대해 고민했던 것은 번호를 다시 입력하는 것이었고, 결국 DBCC CHECKIDENT(tablename, tablename)를 사용하게 되었습니다.REESED, new next number)
행운을 빕니다.
ID 변경은 ID 열에 연결된 개체/관계를 중심으로 여러 요인에 따라 실패할 수 있습니다.여기서 db설계는 id가 변경되는 일이 거의 없기 때문에 문제가 되는 것 같습니다(여러분의 이유가 있고 변경을 캐스캐싱하고 있을 것입니다).만약 ID를 수시로 변경해야 한다면, 사용자가 직접 관리하고 현재 값에서 생성할 수 있는 기본 키/자동 번호가 아닌 새로운 더미 ID 열을 만드는 것이 좋습니다.또는, 아이덴티티 삽입을 허용하는 데 문제가 있는 경우 위의 Chrisotphers 아이디어가 저의 다른 제안이 될 수 있습니다.
행운을 빌어요
PS는 실행 중인 시퀀셜 순서가 ID 목록에 이미 존재하는 항목으로 업데이트하려고 하기 때문에 실패하지 않습니다. 빨대를 움켜쥐고 있는 경우 행 수 + 1을 더하면 행 수를 뺄 수 있습니다:-S.
ID를 가끔 변경해야 할 경우 ID 열을 사용하지 않는 것이 좋습니다.이전에는 각 테이블의 다음 ID를 추적하는 '카운터' 테이블을 사용하여 자동 번호 필드를 수동으로 구현했습니다.IIRC에서는 ID 열이 SQL2000의 데이터베이스 파손의 원인이 되고 있지만 ID를 변경할 수 있는 것이 테스트에 도움이 될 수 있기 때문에 이 작업을 실시했습니다.
값이 수정된 새 행을 삽입한 다음 이전 행을 삭제할 수 있습니다.다음 예제에서는 ID를 외부 키 PersonId와 동일하게 변경합니다.
SET IDENTITY_INSERT [PersonApiLogin] ON
INSERT INTO [PersonApiLogin](
[Id]
,[PersonId]
,[ApiId]
,[Hash]
,[Password]
,[SoftwareKey]
,[LoggedIn]
,[LastAccess])
SELECT [PersonId]
,[PersonId]
,[ApiId]
,[Hash]
,[Password]
,[SoftwareKey]
,[LoggedIn]
,[LastAccess]
FROM [db304].[dbo].[PersonApiLogin]
GO
DELETE FROM [PersonApiLogin]
WHERE [PersonId] <> ID
GO
SET IDENTITY_INSERT [PersonApiLogin] OFF
GO
먼저 모든 ID를 저장하고 원하지 않는 값으로 프로그래밍 방식으로 변경한 후 데이터베이스에서 삭제한 후 유사한 내용을 사용하여 다시 삽입합니다.
use [Name.Database]
go
set identity_insert [Test] ON
insert into [dbo].[Test]
([Id])
VALUES
(2)
set identity_insert [Test] OFF
대량 삽입의 경우:
use [Name.Database]
go
set identity_insert [Test] ON
BULK INSERT [Test]
FROM 'C:\Users\Oscar\file.csv'
WITH (FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
KEEPIDENTITY)
set identity_insert [Test] OFF
file.csv의 샘플 데이터:
2;
3;
4;
5;
6;
설정하지 않으면identity_insert
off 에 다음의 에러가 표시됩니다.
ID_인 경우 '테스트' 테이블의 ID 열에 대한 명시적 값을 삽입할 수 없습니다.INSERT가 OFF로 설정되어 있습니다.
마지막 순간에 도움이 된 좋은 기사를 봤어요.아이덴티티 컬럼이 있는 테이블에 몇 개의 행을 삽입하려고 했지만 잘못되어 다시 삭제해야 했습니다.행을 삭제한 후 ID 열이 변경되었습니다. 삽입된 열을 업데이트할 방법을 찾았지만 성공하지 못했습니다.그래서 구글에서 검색하던 중 링크를 발견했습니다.
- 잘못 삽입된 열을 삭제했습니다.
- ID 켜기/끄기를 사용하여 강제 삽입 사용(아래 설명)
매우 좋은 질문입니다.우선 IDITY에 대해 설명해야 합니다.특정 테이블에 대한 INSERT를 수행한 후 삽입 쿼리를 실행합니다(열 이름을 지정해야 함).
주의: ID 열을 편집한 후에는 ID_를 꺼야 합니다.삽입하지 않으면 다른 테이블의 ID 열을 편집할 수 없습니다.
SET IDENTITY_INSERT Emp_tb_gb_Menu ON
INSERT Emp_tb_gb_Menu(MenuID) VALUES (68)
SET IDENTITY_INSERT Emp_tb_gb_Menu OFF
http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html
언급URL : https://stackoverflow.com/questions/751522/how-to-change-identity-column-values-programmatically
'source' 카테고리의 다른 글
C#을 사용하여 Excel 파일의 데이터를 읽는 방법 (0) | 2023.04.12 |
---|---|
EXISTES를 직접 선택할 수 있습니까? (0) | 2023.04.07 |
베스트 프랙티스가 없는 경우 SQL Server 삽입 (0) | 2023.04.07 |
SQL 서버에서 상위 100개 레코드를 업데이트하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
스크립트 또는 스토어드 프로시저에서 일회용 기능을 만들 수 있습니까? (0) | 2023.04.07 |