제목으로 이미 150000 개의 레코드가 채워진 기존 테이블이 있습니다. Id 열 (현재 null입니다)을 추가했습니다.SQL Server가 기존 테이블에 기본 증가 키를 추가합니다.
이 열을 증가 숫자로 채우기 위해 쿼리를 실행 한 다음 기본 키로 설정하고 자동 증가를 설정한다고 가정합니다. 이것이 올바른 진행 방법입니까? 그렇다면 어떻게 초기 숫자를 채울 수 있습니까?
제목으로 이미 150000 개의 레코드가 채워진 기존 테이블이 있습니다. Id 열 (현재 null입니다)을 추가했습니다.SQL Server가 기존 테이블에 기본 증가 키를 추가합니다.
이 열을 증가 숫자로 채우기 위해 쿼리를 실행 한 다음 기본 키로 설정하고 자동 증가를 설정한다고 가정합니다. 이것이 올바른 진행 방법입니까? 그렇다면 어떻게 초기 숫자를 채울 수 있습니까?
없음 - 당신의 주위에 그것을 다른 방법으로 할 필요가 : 오른쪽을 추가 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
IDENTITY를 "켤 수 없습니다": 테이블을 다시 작성합니다.
숫자 순서에 신경 쓰지 않는다면 IDENTITY와 함께 NULL이 아닌 열을 한 번에 추가하십시오. 150k 행은 많지 않습니다.
번호 순서를 유지해야하는 경우 그에 따라 번호를 추가하십시오. 그런 다음 SSMS 테이블 디자이너를 사용하여 IDENTITY 속성을 설정합니다. 이렇게하면 열 삭제/추가/유지/사용자를 위해 다시 시드 할 스크립트를 생성 할 수 있습니다.
OP는 SQL Server 2008에 있습니다 [그래서 거기에 방법이 있습니다] (http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table-without-any- 데이터 테이블/데이터 손실/6086661 # 6086661) –
@Martin : 흥미로운 우리는 시스템 테이블을 다시 둘러 볼 수 있습니다 ... – gbn
전체 인스턴스는 단일 사용자 모드에서 시작해야하므로 대부분의 상황에서는 실행 가능하지 않지만 'ALTER TABLE .. SWITCH'는 그것없이 할 수 있습니다. –
는 (먼저 테스트 테이블에) 이런 식으로 뭔가를 시도 :
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 질문에 답하지 않습니다 (이는 IDENTITY 열 추가에 관한 것이므로) 어쨌든 작동하지 않습니다. 'UPDATE your_table SET your_id_field = MAX (your_id_field) + 1' 그냥 'MAX'에서 척할 수 없습니다. 같은 행을 반복적으로 업데이트하는 것을 피하기 위해'WHERE' 절은 어디에 있습니까? –
이 문제가 있지만 여러 이유로 ID 열을 사용할 수 없습니다. 나는이에 정착 :
DECLARE @id INT
SET @id = 0
UPDATE table SET @id = id = @id + 1
이
here에서 빌린.
기존 테이블에 ID 열을 추가하면 수동으로 채울 필요가 없습니다.
열이 이미 테이블에 존재하고 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
당신은 나와 함께 시간을 절약했습니다! @ gbn의 대답에 대한 좋은 부록. –
당신이 시도 할 수있는 생각이다. 원본 테이블 - 식별 열 테이블 없음 새 테이블 만들기 - 식별 열과 함께 table2를 호출하십시오. table1에서 table2로 데이터를 복사하십시오. - 식별 컬럼은 자동으로 증가 된 숫자로 자동으로 채워집니다.
는 원래 테이블의 이름을 변경 - 은 새 테이블의 이름을 변경 표 3 할 표 - 표 (원본 테이블)에 표 2 은 ID 열을 가진 표가 포함되어 있으며 기존 데이터에 대한 인구 이제했다. 문제가 없는지 제대로 확인한 후에 더 이상 필요하지 않은 경우 table3을 삭제하십시오.다른 이름 및 동일한 열, 기본 키 및 외래 키 연관을 사용하여 새 테이블을 만들고이를 삽입 문의 코드에 연결하십시오. 예 : 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)
)
그러나 기존 직원 테이블을 삭제하거나 요구 사항에 따라 조정해야합니다.
이 MariaDB에서 작동하므로 나는 그것이 SQL 서버에서와 희망 만 할 수 있습니다 다음 구문을 사용합니다, 당신은 단지 삽입 한 ID 열을 드롭 -
ALTER의 table_name 테이블 ID INT PRIMARY KEY AUTO_INCREMENT 추가하기 ;
다른 테이블이 필요 없습니다. 이것은 단순히 id 컬럼을 삽입하고, 그것을 기본 인덱스로 만들고 순차 값으로 채 웁니다. SQL Server가이 작업을 수행하지 않는다면 시간 낭비에 대해 사과드립니다. 당신이 (1,1) 오른쪽 클릭 ID를 설정 할 수있는 디자이너에 의해
는 TBL => 종로 => 부분의 왼쪽 (오른쪽 클릭) => => ID 열에서 속성
#column 선택 테이블이 다른 테이블의 기본 또는 foriegen 키를 사용과의 관계가있는 경우이것이 좋은 접근 방법인지 여부에 대한 정보가 있습니까? OP는 그것이 "진행하는 올바른 방법"인지 묻습니다. 보다 완전한 대답은 그들이 접근법의 장단점을 알 수 있도록 도울 수 있습니다. – jinglesthula
정말이 옵션을 개발 환경에서 사용하고 있습니다. 프로덕션 환경으로이 변경 사항을 전달한 경우 신원 필드가 일부 Store 프로 시저에서 사용 중이면 VIEW DEPENDENCY로 확인해야합니다. –
, 당신의 테이블을 변경하는 것은 불가능 할 수있다. 그래서 당신은 테이블을 다시 떨어 뜨리고 만들어야합니다.
이러한 문제를 해결하려면 데이터베이스를 마우스 오른쪽 단추로 클릭하고 고급 옵션에서 스키마 및 데이터로 스크립팅 할 데이터 유형을 설정하여 스크립트를 생성해야합니다. 그 후에,이 스크립트를 사용하여 컬럼을 변경하여 해당 조회를 실행하여 테이블을 식별하고 다시 생성하십시오.
쿼리는 여기처럼 될 것입니다 : 내가하면 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
. GUI에서 사용할 수 없었던 'IDENTITY'키워드를 사용하려고 할 때 SQL 오류가 발생했습니다. AUTO_INCREMENT가 선택된 새 행을 추가하고 해당 유형을 INT PRIMARY로 추가했을 때 작동했습니다. – daveagp
Identity 키워드는 SQL Server와 관련이 있습니다. Auto_Increment는 찾은 MySQL 버전입니다. http://stackoverflow.com/questions/10283780/equivalent-of-mssql-identity-column-in-mysql – AndyMcKenna
이것은 정말 좋은 답변이지만 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