SQL Serverデータベースのテーブルからいくつかのレコードを削除しました。これで、IDは101から1200になりました。レコードをもう一度削除したいのですが、IDを102に戻したいのですが、SQL Serverでこれを行う方法はありますか?
SQL Serverデータベースのテーブルからいくつかのレコードを削除しました。これで、IDは101から1200になりました。レコードをもう一度削除したいのですが、IDを102に戻したいのですが、SQL Serverでこれを行う方法はありますか?
回答:
次のコマンドを発行して、mytableを1から始まるように再シードします。
DBCC CHECKIDENT (mytable, RESEED, 0)
Books on Line(BOL、SQLヘルプ)でそれについて読んでください。また、設定しているシードよりも高いレコードがないことに注意してください。
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
number = 0の場合、次の挿入で自動インクリメントフィールドには値1が含まれます
number = 101の場合、次の挿入で自動増分フィールドに値102が含まれます
いくつかの追加情報...役に立つかもしれません上記のクエリで
自動インクリメントを行う前にnumber
、既存のテーブルの自動インクリメント列にそれより小さい値が含まれていることを確認する必要がありますnumber
。
table(table1)からcolumn(column_name)の最大値を取得するには、次のクエリを使用できます
SELECT MAX(column_name) FROM table1
半ばか証拠:
declare @max int;
select @max = max(key) from table;
dbcc checkident(table,reseed,@max)
http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete
MySQLを使用している場合は、次のことを試してください。
ALTER TABLE tablename AUTO_INCREMENT = 1
データベース内のすべてのテーブルを削除して再シードします。
USE [DatabaseName]
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" -- Disable All the constraints
EXEC sp_MSForEachTable "DELETE FROM ?" -- Delete All the Table data
Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" -- Enable All the constraints back
-- You may ignore the errors that shows the table without Auto increment field.
承認された回答に基づいて、完全なスキーマ修飾で同様の問題が発生した場合:
([MyDataBase].[MySchemaName].[MyTable]
)...エラーが発生します。そのDBのコンテキストにいる必要があります
つまり、以下はエラーをスローします。
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
代わりに、完全修飾テーブル名を単一引用符で囲みます。
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
いくつかの回答では、次のようなステートメントの使用を推奨しています。
DBCC CHECKIDENT (mytable, RESEED, 0)
しかし、OPは「一部のレコードを削除しました」と言ったため、すべてではない可能性があるため、値0が常に正しいとは限りません。別の回答では、現在の最大値を自動的に見つけて再シードすることを提案しましたが、テーブルにレコードがない場合に問題が発生し、max()がNULLを返します。単に使用して提案されたコメント
DBCC CHECKIDENT (mytable)
値をリセットしますが、別のコメントでは、これは値をテーブル内の既存の最大値までしか増加しないと正しく述べています。値がテーブルの最大値よりも高い場合、値は減少しません。これは、OPが実行したかったことです。
より良い解決策は、これらのアイデアを組み合わせたものです。テーブルにレコードがある場合、最初のCHECKIDENTは値を0にリセットし、2番目の値は現在テーブルにある最大値にリセットします。
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
複数のコメントが示しているので、削除されたレコードを指す他のテーブルに外部キーがないことを確認してください。それ以外の場合、これらの外部キーは、テーブルを再シードした後に作成したレコードを指します。これは、ほとんどの場合、意図したものではありません。
DBCC CHECKIDENT
テーブルにスキーマを使用すると-approachが問題を生成するため、この回答を追加したいと思います。これを確認してください:
DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);
操作の成功を確認したい場合は、
SELECT IDENT_CURRENT(@Table);
0
上記の例で出力されるはずです。
一般的にはこれを実行する必要はありません。再シードはデータの整合性の問題を引き起こす可能性があります。実際には、すべてのテストデータを消去してやり直す開発システムでのみ使用できます。すべての関連レコードが削除されていない場合に備えて、本番システムでは使用しないでください(外部キー関係にある必要があるすべてのテーブルが削除されているわけではありません)。これを行う混乱を作成できます。削除するたびに定期的に行う場合は特にそうです。IDフィールド値のギャップを心配するのは悪い考えです。
これはどうですか?
ALTER TABLE `table_name`
MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
これは、自動インクリメントを0または任意の数値に変更するためのすばやく簡単な方法です。私はデータベースをエクスポートして自分でコードを読むことでこれを理解しました。
次のように記述して、単一行のソリューションにすることもできます。
ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;