[SQL] 어떻게 SQL Server의 ID 열이 업데이트?
SQL어떻게 SQL Server의 ID 열이 업데이트?
나는 SQL Server 데이터베이스를하고 시작했기 때문에 나는 ID 열을 변경하려면 큰 숫자 10010과 그리고 다른 테이블과 관련이, 지금은 200 개 기록을하고 난 기록이 증가하기 전에이 문제를 해결하려면.
이 열을 변경하거나 재설정하는 가장 좋은 방법은 무엇입니까?
해결법
-
==============================
1.몇 가지 대안이 있지만 요구 사항의 유사한 종류를 달성했다.
몇 가지 대안이 있지만 요구 사항의 유사한 종류를 달성했다.
테이블의 현재 ID 값을 확인하고 필요할 경우 ID 값을 변경 사용 DBCC CHECKIDENT.
DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)
명시 적 값을 허용 사용 IDENTITY_INSERT 테이블의 식별 컬럼에 삽입합니다.
SET IDENTITY_INSERT YourTable {ON|OFF}
예:
-- Set Identity insert on so that value can be inserted into this column SET IDENTITY_INSERT YourTable ON GO -- Insert the record which you want to update with new value in the identity column INSERT INTO YourTable(IdentityCol, otherCol) VALUES(13,'myValue') GO -- Delete the old row of which you have inserted a copy (above) (make sure about FK's) DELETE FROM YourTable WHERE ID=3 GO --Now set the idenetity_insert OFF to back to the previous track SET IDENTITY_INSERT YourTable OFF
-
==============================
2.귀하의 질문에 권리를 가지고 있다면 당신은 같은 것을하고 싶어
귀하의 질문에 권리를 가지고 있다면 당신은 같은 것을하고 싶어
update table set identity_column_name = some value
내가 그것을 쉬운 과정이 아니다 그것에 관련된 일부 외래 키가있을 수 있습니다로는 사용하지 않는 것이 좋습니다 당신을 말해 보자.
그러나 여기 그것을 할 단계는, 백 테이블의 보시기 바랍니다
1 단계 - 테이블의 디자인 선택보기
단계는 ID 열을 끄고 2
이제 업데이트 쿼리를 사용할 수 있습니다.
이제 ID 열에서 1 단계와 2 단계 및 전원을 켜고 다시 실행
참고
-
==============================
3.당신은 필요
당신은 필요
set identity_insert YourTable ON
그런 다음 행을 삭제하고 다른 ID로 다시 삽입합니다.
작업이 완료되면 삽입은 IDENTITY_INSERT를 해제하는 것을 잊지 마세요
set identity_insert YourTable OFF
-
==============================
4.
--before running this make sure Foreign key constraints have been removed that reference the ID. --set table to allow identity to be inserted SET IDENTITY_INSERT yourTable ON; GO --insert everything into a temp table SELECT * INTO #tmpYourTable FROM yourTable --clear your table DELETE FROM yourTable --insert back all the values with the updated ID column INSERT INTO yourTable (IDCol, OtherCols) SELECT ID+1 as updatedID --put any other update logic to the ID here , OtherCols FROM #tmpYourTable --drop the temp table DROP TABLE #tmpYourTable --put identity back to normal SET IDENTITY_INSERT yourTable OFF; GO
-
==============================
5.DBCC CHECKIDENT를 사용해보십시오 :
DBCC CHECKIDENT를 사용해보십시오 :
DBCC CHECKIDENT ('YourTable', RESEED, 1);
-
==============================
6.ID 열없이 새 테이블에 테이블을 복사합니다.
ID 열없이 새 테이블에 테이블을 복사합니다.
select columns into newtable from yourtable
기본 키로 새로운 씨앗을 newtable에 ID 열을 추가 할
ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY
-
==============================
7.
DBCC CHECKIDENT(table_name, RESEED, value)
TABLE_NAME에 =는 값을 재설정하려는 테이블을 제공
값 = 초기 값은 제로로 1 ID 열 시작할
-
==============================
8.
SET IDENTITY_INSERT dbo.TableName ON INSERT INTO dbo.TableName ( TableId, ColumnName1, ColumnName2, ColumnName3 ) VALUES ( TableId_Value, ColumnName1_Value, ColumnName2_Value, ColumnName3_Value ) SET IDENTITY_INSERT dbo.TableName OFF
SQL은 당신이 그들을 지정하지 않고 삽입 할 수 없기 때문에 열 이름을 포함하는 것을 잊지 마세요 IDENTITY_INSERT를 사용하는 경우
-
==============================
9.당신은 또한 당신이 식별 컬럼에 값을 삽입 할 수 있도록 SET IDENTITY INSERT를 사용할 수 있습니다.
당신은 또한 당신이 식별 컬럼에 값을 삽입 할 수 있도록 SET IDENTITY INSERT를 사용할 수 있습니다.
예:
SET IDENTITY_INSERT dbo.Tool ON GO
그리고 당신은 ID 열에 필요한 값을 삽입 할 수 있습니다.
-
==============================
10.
ALTER TABLE tablename add newcolumn int update tablename set newcolumn=existingcolumnname ALTER TABLE tablename DROP COLUMN existingcolumnname; EXEC sp_RENAME 'tablename.oldcolumn' , 'newcolumnname', 'COLUMN' update tablename set newcolumnname=value where condition
더 기본 - 외부 키 관계가없는 경우에는 위의 코드에만 작동
-
==============================
11.명령 빌더를 사용하여 C #을 프로그래머를위한 완벽한 솔루션
명령 빌더를 사용하여 C #을 프로그래머를위한 완벽한 솔루션
우선, 당신은이 사실을 알고있다 :
그래서, 그것을 알고 나면, 당신이해야 할 일은이다. 어느 쪽이든 자신의 SQL 삽입 문을 프로그램 또는 프로그램 당신 자신의 삽입 명령 빌더. 또는 I'be 당신을 위해 프로그램 된 것으로이 하나를 사용하십시오. DataTable을가 주어지면, SQL 삽입 스크립트를 생성합니다 :
public static string BuildInsertSQLText ( DataTable table ) { StringBuilder sql = new StringBuilder(1000,5000000); StringBuilder values = new StringBuilder ( "VALUES (" ); bool bFirst = true; bool bIdentity = false; string identityType = null; foreach(DataRow myRow in table.Rows) { sql.Append( "\r\nINSERT INTO " + table.TableName + " (" ); foreach ( DataColumn column in table.Columns ) { if ( column.AutoIncrement ) { bIdentity = true; switch ( column.DataType.Name ) { case "Int16": identityType = "smallint"; break; case "SByte": identityType = "tinyint"; break; case "Int64": identityType = "bigint"; break; case "Decimal": identityType = "decimal"; break; default: identityType = "int"; break; } } else { if ( bFirst ) bFirst = false; else { sql.Append ( ", " ); values.Append ( ", " ); } sql.Append ("["); sql.Append ( column.ColumnName ); sql.Append ("]"); //values.Append (myRow[column.ColumnName].ToString() ); if (myRow[column.ColumnName].ToString() == "True") values.Append("1"); else if (myRow[column.ColumnName].ToString() == "False") values.Append("0"); else if(myRow[column.ColumnName] == System.DBNull.Value) values.Append ("NULL"); else if(column.DataType.ToString().Equals("System.String")) { values.Append("'"+myRow[column.ColumnName].ToString()+"'"); } else values.Append (myRow[column.ColumnName].ToString()); //values.Append (column.DataType.ToString() ); } } sql.Append ( ") " ); sql.Append ( values.ToString () ); sql.Append ( ")" ); if ( bIdentity ) { sql.Append ( "; SELECT CAST(scope_identity() AS " ); sql.Append ( identityType ); sql.Append ( ")" ); } bFirst = true; sql.Append(";"); values = new StringBuilder ( "VALUES (" ); } //fin foreach return sql.ToString (); }
-
==============================
12.나는 DBCC를 사용하여 다음 삽입을 사용하여 먼저이 문제를 해결했다. 예를 들어 테이블 인 경우
나는 DBCC를 사용하여 다음 삽입을 사용하여 먼저이 문제를 해결했다. 예를 들어 테이블 인 경우
첫째 NEW_RESEED_VALUE 같은 테이블에 새로운 현재 ID 값을 설정
{을 MyTable IDCol; 콜라, Colba }
DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE)
당신은 사용할 수 있습니다
insert into MyTable (colA, ColB) select colA, colB from MyTable
이 모든 기록을 복제하지만 NEW_RESEED_VALUE로 시작하는 새로운 IDCol 값을 사용한다. 당신이 제거 한 후에는 다음 높은 ID 값 중복 행을 제거 할 수 있습니다 / 자신의 외래 키 참조를 이동있는 경우.
-
==============================
13.다음 코드를 사용하여 새 테이블을 만들 수 있습니다.
다음 코드를 사용하여 새 테이블을 만들 수 있습니다.
SELECT IDENTITY (int, 1, 1) AS id, column1, column2 INTO dbo.NewTable FROM dbo.OldTable
그리고 기존 DB를 삭제하고, 기존 DB의 이름으로 새로운 DB 이름을 바꿉니다. 주 : 1 열 및 2 열은 당신의 새로운 테이블을 유지하려는 기존 테이블의 모든 열을 나타내고있다.
-
==============================
14.당신은 특별히 다른 번호 (-> 1123 전 123)에 기본 키 값을 변경해야하는 경우. PK가 값을 변경 IDENTITY 속성 블록. 설정 IDENTITY_INSERT 작동하지 않을 수 있습니다. (참조 무결성 검사가 꺼져있는 경우를 제외하고) 당신이 모두 삭제 한 경우 삽입 / 삭제 이렇게하면 바람직하지 않습니다.
당신은 특별히 다른 번호 (-> 1123 전 123)에 기본 키 값을 변경해야하는 경우. PK가 값을 변경 IDENTITY 속성 블록. 설정 IDENTITY_INSERT 작동하지 않을 수 있습니다. (참조 무결성 검사가 꺼져있는 경우를 제외하고) 당신이 모두 삭제 한 경우 삽입 / 삭제 이렇게하면 바람직하지 않습니다.
이 스크립트는 PK에 정체성을 해제합니다 :
*********************** sp_configure 'allow update', 1 go reconfigure with override go update syscolumns set colstat = 0 --turn off bit 1 which indicates identity column where id = object_id('table_name') and name = 'column_name' go exec sp_configure 'allow update', 0 go reconfigure with override go ***********************
그들은 외부 키 참조를 업데이 트됩니다, 그래서 다음, 당신은 관계를 설정할 수 있습니다. 아니면 당신은 관계 집행을 해제해야합니다. 이 SO 링크 쇼 방법 : 어떻게 외래 키 제약 조건이 일시적으로 T-SQL을 사용하여 비활성화 할 수 있습니다?
지금, 당신은 당신의 업데이트를 할 수 있습니다. 내 경우에는 (동일한 열 이름을 기준으로 내 모든 업데이트 SQL을 작성하는 간단한 스크립트를 작성, 나는 백만하여 CaseID을 높일 필요 :
select 'update ['+c.table_name+'] SET ['+Column_Name+']=['+Column_Name+']+1000000' from Information_Schema.Columns as c JOIN Information_Schema.Tables as t ON t.table_Name=c.table_name and t.Table_Schema=c.table_schema and t.table_type='BASE TABLE' where Column_Name like 'CaseID' order by Ordinal_position
마지막으로, 기본 키에 ID 열을 재 활성화 한 후 참조 무결성을 다시 사용하도록 설정합니다.
참고 : 나는이 질문에 대한 일부 사람들은 왜 질문을 참조하십시오. 내 경우, 나는 두 번째 인스턴스를 종료 할 수 있도록 마스터 DB에 두 번째 생산 인스턴스에서 데이터를 병합해야합니다. 난 그냥 충돌 운영 데이터의 모든 PK / FKS이 필요합니다. 메타 데이터 FKS는 동일하다.
from https://stackoverflow.com/questions/19155775/how-to-update-identity-column-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 드라이버 (SSL) 암호화 보안 소켓 레이어를 사용하여 SQL 서버에 대한 보안 연결을 설정할 수 없음 (0) | 2020.05.14 |
---|---|
[SQL] 어떻게 오라클에 Timestamp_to_scn 및 Scn_to_timestamp를 사용 하는가? (0) | 2020.05.14 |
[SQL] T-SQL : 어떻게 동적 SQL에서 매개 변수를 사용하는 방법? (0) | 2020.05.14 |
[SQL] 우리는 SQL을 사용하여 MS 액세스 데이터베이스의 모든 테이블을 나열 할 수 있습니다? (0) | 2020.05.14 |
[SQL] SQL의 최상위 부모를 찾기 (0) | 2020.05.14 |