복붙노트

[SQL] 어떻게 SQL Server의 ID 열이 업데이트?

SQL

어떻게 SQL Server의 ID 열이 업데이트?

나는 SQL Server 데이터베이스를하고 시작했기 때문에 나는 ID 열을 변경하려면 큰 숫자 10010과 그리고 다른 테이블과 관련이, 지금은 200 개 기록을하고 난 기록이 증가하기 전에이 문제를 해결하려면.

이 열을 변경하거나 재설정하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    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. ==============================

    2.귀하의 질문에 권리를 가지고 있다면 당신은 같은 것을하고 싶어

    귀하의 질문에 권리를 가지고 있다면 당신은 같은 것을하고 싶어

    update table
    set identity_column_name = some value
    

    내가 그것을 쉬운 과정이 아니다 그것에 관련된 일부 외래 키가있을 수 있습니다로는 사용하지 않는 것이 좋습니다 당신을 말해 보자.

    그러나 여기 그것을 할 단계는, 백 테이블의 보시기 바랍니다

    1 단계 - 테이블의 디자인 선택보기

    단계는 ID 열을 끄고 2

    이제 업데이트 쿼리를 사용할 수 있습니다.

    이제 ID 열에서 1 단계와 2 단계 및 전원을 켜고 다시 실행

    참고

  3. ==============================

    3.당신은 필요

    당신은 필요

    set identity_insert YourTable ON
    

    그런 다음 행을 삭제하고 다른 ID로 다시 삽입합니다.

    작업이 완료되면 삽입은 IDENTITY_INSERT를 해제하는 것을 잊지 마세요

    set identity_insert YourTable OFF
    
  4. ==============================

    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. ==============================

    5.DBCC CHECKIDENT를 사용해보십시오 :

    DBCC CHECKIDENT를 사용해보십시오 :

    DBCC CHECKIDENT ('YourTable', RESEED, 1);
    
  6. ==============================

    6.ID 열없이 새 테이블에 테이블을 복사합니다.

    ID 열없이 새 테이블에 테이블을 복사합니다.

        select columns into newtable from yourtable
    

    기본 키로 새로운 씨앗을 newtable에 ID 열을 추가 할

        ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY
    
  7. ==============================

    7.

    DBCC CHECKIDENT(table_name, RESEED, value)
    

    TABLE_NAME에 =는 값을 재설정하려는 테이블을 제공

    값 = 초기 값은 제로로 1 ID 열 시작할

  8. ==============================

    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. ==============================

    9.당신은 또한 당신이 식별 컬럼에 값을 삽입 할 수 있도록 SET IDENTITY INSERT를 사용할 수 있습니다.

    당신은 또한 당신이 식별 컬럼에 값을 삽입 할 수 있도록 SET IDENTITY INSERT를 사용할 수 있습니다.

    예:

    SET IDENTITY_INSERT dbo.Tool ON
    GO
    

    그리고 당신은 ID 열에 필요한 값을 삽입 할 수 있습니다.

  10. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    13.다음 코드를 사용하여 새 테이블을 만들 수 있습니다.

    다음 코드를 사용하여 새 테이블을 만들 수 있습니다.

    SELECT IDENTITY (int, 1, 1) AS id, column1, column2
    INTO dbo.NewTable
    FROM dbo.OldTable
    

    그리고 기존 DB를 삭제하고, 기존 DB의 이름으로 새로운 DB 이름을 바꿉니다. 주 : 1 열 및 2 열은 당신의 새로운 테이블을 유지하려는 기존 테이블의 모든 열을 나타내고있다.

  14. ==============================

    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는 동일하다.

  15. from https://stackoverflow.com/questions/19155775/how-to-update-identity-column-in-sql-server by cc-by-sa and MIT license