web-dev-qa-db-ja.com

SQL ServerのID列を更新する方法

私はSQL Serverデータベースを持っていて、10010という大きな数字で始まり、別のテーブルに関連付けられているため、identity列を変更したいと思います。今は200レコードあり、レコードが増加する前にこの問題を解決します。

この列を変更またはリセットするための最良の方法は何ですか?

147

SQL Serverでは、通常の列でできることとは異なり、identity列の値を更新することはできません。そのため、ID列を更新することはできません。

同様の種類の要件を満たすための代替手段がいくつかありますが。そのうちの一つは:

使用 DBCCチェックイン

DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)

既存のレコードの識別列の値を更新したい場合は、設定する必要があります。

set identity_insert YourTable ON

-- 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 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 prevoius track
SET IDENTITY_INSERT YourTable OFF
213
Sachin

あなたの質問が正しいなら、あなたは以下のようなことをしたいです。

update table
set identity_column_name = some value

foreign keyが関連付けられている可能性があるため、簡単なプロセスではなく、使用することはお勧めできません。

しかし、ここでそれを行うためのステップがあります、テーブルのback-upを取ってください

ステップ1 - テーブルのデザインビューを選択します

enter image description here

ステップ2 - ID列をオフにする

enter image description here

これでupdateクエリを使うことができます。

ステップ1とステップ2をredoにして、ID列をオンにします。

参照

50
Luv

必要がある

set identity_insert YourTable ON

次に、行を削除して別のIDで再挿入してください。

挿入が完了したら、identity_insertをオフにすることを忘れないでください。

set identity_insert YourTable OFF
42
R S P
--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
10
kuklei

DBCC CHECKIDENT を使用してみてください。

DBCC CHECKIDENT ('YourTable', RESEED, 1);
5
Darren

iD列のない新しいテーブルに自分のテーブルをコピーします。

    select columns into newtable from yourtable

新しいシードを使ってnewtableにidentity列を追加し、それを主キーにする

    ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY
4
user4002899

SET IDENTITY INSERT を使用して、ID列に値を挿入することもできます。

例:

SET IDENTITY_INSERT dbo.Tool ON
GO

そして、必要な値をidentity列に挿入することができます。

2
DaveShaw
DBCC CHECKIDENT(table_name, RESEED, value)

table_name =値をリセットしたいテーブルを指定

value =識別列を1から始めるためのゼロになる初期値

2
Yasmeen Ansari

(コマンドビルダーを使用してC#プログラマのための完全なソリューション)

まず第一に、あなたはこの事実を知っていなければなりません: - どんな場合でも、あなたはアイデンティティカラムを修正することができないので、あなたはそのローを削除しそして新しいアイデンティティで再追加しなければなりません。 - 列からidentityプロパティを削除することはできません(columnに削除する必要があります)。-netのカスタムコマンドビルダーは、常にidentity列をスキップするため、この文章処理には使用できません。

だから、一度それを知ったら、あなたがしなければならないのはそれです。独自のSQL Insertステートメントをプログラムするか、独自のinsertコマンドビルダーをプログラムします。それとも私があなたのためにプログラムしたものを使ってください。 DatatTableを指定すると、SQL Insertスクリプトが生成されます。

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 (); ;
        }
1
Juan_Mallorca
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

ただし、上記のコードは主キーと外部キーの関係がない場合にのみ機能します。

1
Jekin Kalariya
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

Identity_Insertを使用するときは、列名を忘れずに含めるようにしてください。これは、sqlでは、指定しないと挿入できないためです。

0
user1407955

私は最初にDBCCを使用し、次にinsertを使用してこの問題を解決しました。例えばあなたのテーブルが

まず、テーブルに新しい現在のID値をNEW_RESEED_VALUEとして設定します。

MyTable {IDCol、colA、colB}

    DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE)

それからあなたは使うことができます

    insert into MyTable (colA, ColB) select colA, colB from MyTable

これにより、すべてのレコードが複製されますが、NEW_RESEED_VALUEから始まる新しいIDCol値が使用されます。外部キー参照がある場合は、削除または移動した後で、より高いID値の重複行を削除できます。

0
Softec

次のコードを使って新しいテーブルを作成できます。

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

その後、古いデータベースを削除し、新しいデータベースの名前を古いデータベースの名前に変更します。:column1とcolumn2は、新しいテーブルに保持したい古いテーブルのすべての列を表します。

0