SQL Server는 기존 테이블에 자동 증분 기본 키를 추가합니다


253

제목으로 150000 레코드로 이미 채워진 기존 테이블이 있습니다. ID 열을 추가했습니다 (현재 null 임).

쿼리를 실행 하여이 열을 증분 숫자로 채운 다음 기본 키로 설정하고 자동 증분을 켤 수 있다고 가정합니다. 이것이 올바른 진행 방법입니까? 그렇다면 어떻게 초기 숫자를 채울 수 있습니까?

답변:


429

아니요-다른 방법으로 수행해야합니다. 가서 바로 추가하십시오 INT IDENTITY.이 작업을 수행하면 ID 값으로 채워집니다.

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

그런 다음 기본 키로 만들 수 있습니다.

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

또는 한 번에 모든 작업을 수행하려는 경우 :

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

2
이것은 정말 좋은 대답이지만 시작 정수를 1에서 1000으로 어떻게 바꿀 수 있습니까? 나는 1000에서 계산을 시작하고 싶습니다. 나는 사용할 수 있다고 생각 ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1하지만 전문가와 확인하지 않고 시도하고 싶지 않았습니다. :) Ref. pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
user1477388

3
방금 이것을 사용했고 그것은 효과가 있었던 것 같습니다alter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
user1477388

1
@ stom : 아무것도 지정하지 않으면 seed = 1과 increment = 1이 사용됩니다-어쨌든 가장 자주 사용되는 설정입니다. 이와 같은 테이블을 만든 경우 제대로 작동합니다. 그러나 특히 대규모 사이트의 경우 SQL 스크립트에서 시드와 증분을 명시 적으로 지정하는 것이 좋습니다. 좋은 습관 일뿐입니다.
marc_s

1
@ stom : 음, 그 PRIMARY KEY의미가 있음을 암시합니다 NOT NULL-다시-절대적으로 필요한 것은 아닙니다. 그러나 나는 일을 선호 명시 하고 난 항상이 때문에 NOT NULL이 단지 절대적으로 명확하게하기
marc_s

3
@ turbo88 : 당신이 당신을 정의 할 때 PRIMARY KEY(사용자가 명시 적으로 지정하지 않는 한, 클러스터 된 인덱스가 당신을 위해 자동으로 생성됩니다 NONCLUSTERED)
marc_s는

19

IDENTITY를 "설정"할 수 없습니다. 테이블을 다시 작성하는 것입니다.

숫자 순서를 신경 쓰지 않으면 IDENTITY를 사용하여 NOT NULL 열을 한 번에 추가하십시오. 150k 행은 많지 않습니다.

숫자 순서를 유지해야하는 경우 그에 따라 숫자를 추가하십시오. 그런 다음 SSMS 테이블 디자이너를 사용하여 IDENTITY 속성을 설정하십시오. 이를 통해 열 삭제 / 추가 / 번호 유지 / 리드를 수행하는 스크립트를 생성 할 수 있습니다.



전체 인스턴스는 단일 사용자 모드에서 시작해야하므로 대부분의 상황에서 실행 가능하지 않지만 가능하지 않은 경우 ALTER TABLE ... SWITCH에는 가능합니다.
마틴 스미스

11

이 문제가 있었지만 다양한 이유로 ID 열을 사용할 수 없습니다. 나는 이것에 정착했다 :

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

여기 에서 빌려 왔습니다 .


4

열이 이미 테이블에 존재하고 null 인 경우이 명령으로 열을 업데이트 할 수 있습니다 (id, tablename 및 tablekey 교체).

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x

당신은 이것으로 시간을 절약했습니다! @gbn의 답변에 대한 좋은 부록.
Kristen Waite

2

기존 테이블에 열을 추가하고 식별하면 열을 자동으로 채울 필요가 없으며 수동으로 채울 필요가 없습니다.


2

디자이너에 의해 tbl => desing => 부분 왼쪽에서 마우스 오른쪽 버튼 클릭 (오른쪽 클릭) => 속성 => ID 열에서 # 열을 선택하십시오.

속성

idendtity 열


1
이것이 좋은 접근 방법인지에 대한 정보가 있습니까? OP는 "정확한 진행 방법"인지 묻고 있습니다. 보다 완전한 대답은 접근 방식의 장단점을 아는 데 도움이 될 수 있습니다.
jinglesthula

실제로 개발 환경에서이 옵션을 사용하고 있습니다.이 변경 사항을 프로덕션에 전달하려면 일부 저장 프로 시저 o 트리거에서 ID 필드를 사용중인 경우 VIEW DEPENDENCY로 확인해야합니다.
gustavo herrera 2012 년

2

테이블이 기본 또는 foriegen 키를 사용하여 다른 테이블과 관계가있는 경우 테이블을 변경하는 것이 불가능할 수 있습니다. 따라서 테이블을 삭제하고 다시 만들어야합니다.
이러한 문제를 해결하려면 데이터베이스를 마우스 오른쪽 단추로 클릭하고 고급 옵션에서 데이터 유형을 구성표 및 데이터에 스크립트로 작성하여 스크립트를 생성해야합니다. 그 후, 쿼리 실행을 사용하여 테이블을 식별하고 재생성하기 위해 열을 변경하면서이 스크립트를 사용하십시오.
귀하의 검색어는 다음과 같습니다.

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 

0

시도해 볼 수있는 아이디어가 있습니다. ID 테이블이없는 원래 테이블 table1은 새 테이블을 작성합니다. 식별 컬럼과 함께 table2를 호출하십시오. table1에서 table2로 데이터 복사-ID 열은 자동 증분 숫자로 자동 채워집니다.

원래 테이블 이름을 table1에서 table3으로 바꿉니다. 새 테이블 이름을 table2로 바꾸십시오 (원본 테이블). 이제 기존 데이터에 대해 식별 열이 포함되고 채워진 table1이 있습니다. 문제가없고 올바르게 작동하는지 확인한 후 더 이상 필요하지 않으면 table3을 삭제하십시오.


0

다른 이름과 동일한 열, 기본 키 및 외래 키 연결을 사용하여 새 테이블을 만들고이를 코드 삽입 문에 연결하십시오. 예 : 직원의 경우 직원으로 바꿉니다.

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

그러나 기존 EMPLOYEE 테이블을 삭제하거나 요구 사항에 따라 일부 조정을 수행해야합니다.


0

이 답변은 최고 투표 답변에 약간 추가 된 것이며 SQL Server에서 작동합니다. 질문에 자동 증분 기본 키가 요청되었지만 현재 답변에 기본 키가 추가되었지만 자동 증분으로 플래그가 지정되지 않았습니다. 아래 스크립트는 열의 존재 여부를 확인하고 자동 증분 플래그를 활성화하여 추가합니다.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO

0
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1) 
update 

5
당신은 그것을 설명 할 수 있습니까?
Muhammad Dyas Yaskur

1
이 코드는 OP 문제를 해결할 수 있지만 코드가 OP 문제를 해결하는 방법에 대한 설명을 포함하는 것이 가장 좋습니다. 이런 식으로, 미래 방문자는 귀하의 게시물에서 배우고 자신의 코드에 적용 할 수 있습니다. SO는 코딩 서비스가 아니라 지식을위한 리소스입니다. 또한 고품질의 완전한 답변이 상향 조정될 가능성이 높습니다. 이러한 기능은 모든 게시물이 자체적으로 포함되어야한다는 요구 사항과 함께 플랫폼으로서 SO의 강점 중 일부이며 포럼과 차별화됩니다. 추가 정보를 추가하거나 소스 문서로 설명을 보완하도록 편집 할 수 있습니다.
ysf

-1

테이블 변경 / ** 테이블 이름 붙여 넣기 ** / id int IDENTITY (1,1) 추가

/ **에서 삭제 표 이름을 붙여 넣기 ** /

(

a.id FROM 선택 / ** 테이블 이름 붙여 넣기 / 왼쪽 외부 조인으로 (MIN (id)를 id FROM으로 선택 / 테이블 이름 붙여 넣기 / GROUP BY / 열 c1, c2 .... ** 붙여 넣기

) as t1 
ON a.id = t1.id

t1.id가 NULL 인 경우

)

테이블 변경 / ** 테이블 이름 붙여 넣기 ** / DROP COLUMN id


질문이 뭐야? 어떻게 물어
앤 Kilzer

1
markdown을 사용하여 코드 예제를 올바르게 형식화하여 답변을 편집하십시오.
Bill Keller

-3

다음과 같이 시도하십시오 (먼저 테스트 테이블에서).

your_database_name 사용
가다
(your_id_field가 NULL 인 your_table에서 COUNT (*) 선택)> 0
시작
    행 번호 설정 1
    업데이트 your_table SET your_id_field = MAX (your_id_field) +1
종료
'모두 완료'인쇄

나는 이것을 전혀 테스트하지 않았으므로 조심하십시오!


1
-1 질문에 대답하지 않고 ( IDENTITY열 추가에 관한 ) 어쨌든 작동하지 않습니다. UPDATE your_table SET your_id_field = MAX(your_id_field)+1당신은 MAX거기에 척 할 수 없습니다 . WHERE동일한 행을 반복적으로 업데이트하지 않는 절 은 어디에 있습니까 ?
Martin Smith

-3

이것은 MariaDB에서 작동하므로 SQL Server에서만 가능합니다. 방금 삽입 한 ID 열을 삭제하고 다음 구문을 사용하십시오.

ALTER TABLE table_name ID 추가 기본 키 AUTO_INCREMENT;

다른 테이블이 필요 없습니다. 이것은 단순히 id 열을 삽입하고 기본 인덱스로 만들고 순차적 인 값으로 채 웁니다. SQL Server에서이 작업을 수행하지 않으면 시간을 낭비한 것에 대해 사과드립니다.


-3

ALTER TABLE table_name ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT; 이것은 유용 할 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.