2011-02-01 3 views
182

제목으로 이미 150000 개의 레코드가 채워진 기존 테이블이 있습니다. Id 열 (현재 null입니다)을 추가했습니다.SQL Server가 기존 테이블에 기본 증가 키를 추가합니다.

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

답변

310

없음 - 당신의 주위에 그것을 다른 방법으로 할 필요가 : 오른쪽을 추가 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 
+0

. GUI에서 사용할 수 없었던 'IDENTITY'키워드를 사용하려고 할 때 SQL 오류가 발생했습니다. AUTO_INCREMENT가 선택된 새 행을 추가하고 해당 유형을 INT PRIMARY로 추가했을 때 작동했습니다. – daveagp

+0

Identity 키워드는 SQL Server와 관련이 있습니다. Auto_Increment는 찾은 MySQL 버전입니다. http://stackoverflow.com/questions/10283780/equivalent-of-mssql-identity-column-in-mysql – AndyMcKenna

+2

이것은 정말 좋은 답변이지만 1부터 1000까지의 시작 정수를 어떻게 변경할 수 있습니까? 나는 1000에서 세고 싶습니다. 나는 'ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART with 1'을 사용할 수 있다고 생각하지만 전문가와 확인하지 않고 시도하고 싶지는 않습니다. http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fsqlp%2Frbafysqlpidentity.htm – user1477388

18

IDENTITY를 "켤 수 없습니다": 테이블을 다시 작성합니다.

숫자 순서에 신경 쓰지 않는다면 IDENTITY와 함께 NULL이 아닌 열을 한 번에 추가하십시오. 150k 행은 많지 않습니다.

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

+4

OP는 SQL Server 2008에 있습니다 [그래서 거기에 방법이 있습니다] (http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table-without-any- 데이터 테이블/데이터 손실/6086661 # 6086661) –

+1

@Martin : 흥미로운 우리는 시스템 테이블을 다시 둘러 볼 수 있습니다 ... – gbn

+0

전체 인스턴스는 단일 사용자 모드에서 시작해야하므로 대부분의 상황에서는 실행 가능하지 않지만 'ALTER TABLE .. SWITCH'는 그것없이 할 수 있습니다. –

-3

는 (먼저 테스트 테이블에) 이런 식으로 뭔가를 시도 :

 
USE your_database_name 
GO 
WHILE (SELECT COUNT(*) FROM your_table WHERE your_id_field IS NULL) > 0 
BEGIN 
    SET ROWCOUNT 1 
    UPDATE your_table SET your_id_field = MAX(your_id_field)+1 
END 
PRINT 'ALL DONE' 

나는 모든이를 테스트하지 않았습니다, 그래서 조심!

+1

-1 질문에 답하지 않습니다 (이는 IDENTITY 열 추가에 관한 것이므로) 어쨌든 작동하지 않습니다. 'UPDATE your_table SET your_id_field = MAX (your_id_field) + 1' 그냥 'MAX'에서 척할 수 없습니다. 같은 행을 반복적으로 업데이트하는 것을 피하기 위해'WHERE' 절은 어디에 있습니까? –

8

이 문제가 있지만 여러 이유로 ID 열을 사용할 수 없습니다. 나는이에 정착 :

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

here에서 빌린.

2

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

2

열이 이미 테이블에 존재하고 null의 경우, 당신은 (아이디, 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 
+0

당신은 나와 함께 시간을 절약했습니다! @ gbn의 대답에 대한 좋은 부록. –

0

당신이 시도 할 수있는 생각이다. 원본 테이블 - 식별 열 테이블 없음 새 테이블 만들기 - 식별 열과 함께 table2를 호출하십시오. table1에서 table2로 데이터를 복사하십시오. - 식별 컬럼은 자동으로 증가 된 숫자로 자동으로 채워집니다.

는 원래 테이블의 이름을 변경 - 은 새 테이블의 이름을 변경 표 3 할 표 - 표 (원본 테이블)에 표 2 은 ID 열을 가진 표가 포함되어 있으며 기존 데이터에 대한 인구 이제했다. 문제가 없는지 제대로 확인한 후에 더 이상 필요하지 않은 경우 table3을 삭제하십시오.

0

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

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) 
) 

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

-3

이 MariaDB에서 작동하므로 나는 그것이 SQL 서버에서와 희망 만 할 수 있습니다 다음 구문을 사용합니다, 당신은 단지 삽입 한 ID 열을 드롭 -

ALTER의 table_name 테이블 ID INT PRIMARY KEY AUTO_INCREMENT 추가하기 ;

다른 테이블이 필요 없습니다. 이것은 단순히 id 컬럼을 삽입하고, 그것을 기본 인덱스로 만들고 순차 값으로 채 웁니다. SQL Server가이 작업을 수행하지 않는다면 시간 낭비에 대해 사과드립니다. 당신이 (1,1) 오른쪽 클릭 ID를 설정 할 수있는 디자이너에 의해

1

는 TBL => 종로 => 부분의 왼쪽 (오른쪽 클릭) => => ID 열에서 속성

Properties

#column 선택 테이블이 다른 테이블의 기본 또는 foriegen 키를 사용과의 관계가있는 경우

idendtity column

+0

이것이 좋은 접근 방법인지 여부에 대한 정보가 있습니까? OP는 그것이 "진행하는 올바른 방법"인지 묻습니다. 보다 완전한 대답은 그들이 접근법의 장단점을 알 수 있도록 도울 수 있습니다. – jinglesthula

+0

정말이 옵션을 개발 환경에서 사용하고 있습니다. 프로덕션 환경으로이 변경 사항을 전달한 경우 신원 필드가 일부 Store 프로 시저에서 사용 중이면 VIEW DEPENDENCY로 확인해야합니다. –

0

, 당신의 테이블을 변경하는 것은 불가능 할 수있다. 그래서 당신은 테이블을 다시 떨어 뜨리고 만들어야합니다.
이러한 문제를 해결하려면 데이터베이스를 마우스 오른쪽 단추로 클릭하고 고급 옵션에서 스키마 및 데이터로 스크립팅 할 데이터 유형을 설정하여 스크립트를 생성해야합니다. 그 후에,이 스크립트를 사용하여 컬럼을 변경하여 해당 조회를 실행하여 테이블을 식별하고 다시 생성하십시오.
쿼리는 여기처럼 될 것입니다 : 내가하면 phpMyAdmin 인터페이스를 사용하고

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 
관련 문제