4

次のように作成されたテーブルを使用しています。

CREATE TABLE [dbo].[Tag](
    [TagID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [varchar](200) NOT NULL,
    [TagCount] [varchar](200) NULL,
 CONSTRAINT [PK_Tag] PRIMARY KEY CLUSTERED 
(
    [TagID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

主キーを挿入することはできません。最後のキーから自動継続します。したがって、最後のエントリの主キーが 72 の場合、次のエントリは 73 になります。

今私の問題は、エントリを削除するときです。ここで、エントリの 3 ~ 7 を削除したとします。データベースには、エントリの 1、2、8、9 が保存されます。

削除後に実行して、主キーを1から再度自動シフトするストアドプロシージャはありますか?

4

3 に答える 3

5

使用する

TRUNCATE TABLE [dbo].[Tag]

これにより、すべてのデータが空になり、自動値カウンターがリセットされます。

EDIT:古い値を保存したい場合。一時テーブルを作成し、そこにすべてのデータを保存し、メイン テーブルを切り捨てて再挿入します。しかし、なぜあなたはこれをしたいのですか?

このようなもの(トランザクションで実行):

CREATE TABLE [dbo].[TagTmp] (
 [Value] [varchar](200) NOT NULL,
    [TagCount] [varchar](200) NULL
)
INSERT INTO TagTmp (Value, TagCount)
SELECT Value, TagCount FROM dbo.Tag
TRUNCATE TABLE dbo.Tag
INSERT INTO Tag (Value, TagCount)
SELECT Value, TagCount FROM dbo.TagTmp
DROP TABLE TagTmp

EDIT2:

無料の「古い」自動 ID を持つレコードを挿入する場合は、次を使用します。

SET IDENTITY_INSERT tablename OFF
INSERT INTO tablename (TagId, Value, tagCount) VALUES (3, 'value', 1');
SET IDENTITY_INSERT tablename ON

これにより、レコードを挿入する機会が得られますが、それを行うことはお勧めしません:)

于 2012-05-15T13:00:02.313 に答える
5

これをしたくない理由の簡単な類推:

誰かが電話サービスをキャンセルするたびに、電話会社が戻って、キャンセルされた番号の上に全員の番号を再割り当てして、ギャップをなくしたと想像してみてください。これは、関係者全員にとって頭の痛い問題を引き起こす可能性があります。

PK は一意であるだけでなく、その行に対して一定である必要があります。行の ID を変更すると、問題が発生します。

新しいレコードが追加されたときにギャップを埋めたい場合は、IDENTITY INSERT を使用するか、テーブルから ID を削除して、レコードが挿入されるたびに独自の ID を生成することができます。

そして、何らかの理由でまだ連絡をとっていない場合でも、これをやりたい場合は、RESEED 回答が最適です。

于 2012-05-15T13:14:14.300 に答える
3

使用する必要がありますRESEED

DBCC CHECKIDENT (table_name, RESEED); 

これを削除後のトリガーで使用します。

于 2012-05-15T13:12:19.853 に答える