私はSQL Serverデータベースを持っていて、10010
という大きな数字で始まり、別のテーブルに関連付けられているため、identity列を変更したいと思います。今は200レコードあり、レコードが増加する前にこの問題を解決します。
この列を変更またはリセットするための最良の方法は何ですか?
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
あなたの質問が正しいなら、あなたは以下のようなことをしたいです。
update table
set identity_column_name = some value
foreign key
が関連付けられている可能性があるため、簡単なプロセスではなく、使用することはお勧めできません。
しかし、ここでそれを行うためのステップがあります、テーブルのback-up
を取ってください
ステップ1 - テーブルのデザインビューを選択します
ステップ2 - ID列をオフにする
これでupdate
クエリを使うことができます。
ステップ1とステップ2をredo
にして、ID列をオンにします。
必要がある
set identity_insert YourTable ON
次に、行を削除して別のIDで再挿入してください。
挿入が完了したら、identity_insertをオフにすることを忘れないでください。
set identity_insert YourTable OFF
--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
DBCC CHECKIDENT
を使用してみてください。
DBCC CHECKIDENT ('YourTable', RESEED, 1);
iD列のない新しいテーブルに自分のテーブルをコピーします。
select columns into newtable from yourtable
新しいシードを使ってnewtableにidentity列を追加し、それを主キーにする
ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY
SET IDENTITY INSERT
を使用して、ID列に値を挿入することもできます。
例:
SET IDENTITY_INSERT dbo.Tool ON
GO
そして、必要な値をidentity列に挿入することができます。
DBCC CHECKIDENT(table_name, RESEED, value)
table_name =値をリセットしたいテーブルを指定
value =識別列を1から始めるためのゼロになる初期値
(コマンドビルダーを使用して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 (); ;
}
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
ただし、上記のコードは主キーと外部キーの関係がない場合にのみ機能します。
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では、指定しないと挿入できないためです。
私は最初に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値の重複行を削除できます。
次のコードを使って新しいテーブルを作成できます。
SELECT IDENTITY (int, 1, 1) AS id, column1, column2
INTO dbo.NewTable
FROM dbo.OldTable
その後、古いデータベースを削除し、新しいデータベースの名前を古いデータベースの名前に変更します。 注 :column1とcolumn2は、新しいテーブルに保持したい古いテーブルのすべての列を表します。