source

ID 열 값을 프로그래밍 방식으로 변경하려면 어떻게 해야 합니까?

lovecheck 2023. 4. 7. 21:34
반응형

ID 열 값을 프로그래밍 방식으로 변경하려면 어떻게 해야 합니까?

에는 MS SQL 2005 테이블이 .Test " " " " " " 가 IDID아이디 아이디입니다.

이 테이블에는 행이 있으며 모든 행에는 대응하는 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열 값은 변경할 수 없습니다.

, 하여 ", " " "를 할 수 .IDENTITYproperty, 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_insertoff 에 다음의 에러가 표시됩니다.

ID_인 경우 '테스트' 테이블의 ID 열에 대한 명시적 값을 삽입할 수 없습니다.INSERT가 OFF로 설정되어 있습니다.

마지막 순간에 도움이 된 좋은 기사를 봤어요.아이덴티티 컬럼이 있는 테이블에 몇 개의 행을 삽입하려고 했지만 잘못되어 다시 삭제해야 했습니다.행을 삭제한 후 ID 열이 변경되었습니다. 삽입된 열을 업데이트할 방법을 찾았지만 성공하지 못했습니다.그래서 구글에서 검색하던 중 링크를 발견했습니다.

  1. 잘못 삽입된 열을 삭제했습니다.
  2. ID 켜기/끄기를 사용하여 강제 삽입 사용(아래 설명)

http://beyondrelational.com/modules/2/blogs/28/posts/10337/sql-server-how-do-i-insert-an-explicit-value-into-an-identity-column-how-do-i-update-the-value-of-an.aspx

매우 좋은 질문입니다.우선 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

반응형