SQL Server Management Studio 2012の主キーの自動インクリメント


446

どのように私はしてデータベーステーブル、私はフォーラムを通じて外観を持っていたが、どのように見ることができません。auto incrementprimary keySQL Server

プロパティを確認しましたが、オプションが表示されません。specificationプロパティに移動しIdentityてyesに設定しIdentity increment、1に設定するという回答を確認しましたが、そのセクションはグレー表示されており、変更できませんはいからいいえ。

これを行う簡単な方法があるはずですが、見つかりません。


5
キー列のデータ型はintですか?
Raab

1
@CoDe aDDict現在の設定はchar(10)ですが、練習しているだけなので変更できます。ありがとう
Ledgemonkey

回答:


703

int画像が示すように、Key列のデータ型がであることを確認し、IDを手動で設定します。

ここに画像の説明を入力してください

または このコードを実行する

-- ID is the name of the  [to be] identity column
ALTER TABLE [yourTable] DROP COLUMN ID 
ALTER TABLE [yourTable] ADD ID INT IDENTITY(1,1)

IDテーブル内の唯一の列でない場合、コードが実行されます

画像参照fifo


21
補正のちょうどビットは:IDENTITY(それができるように、プロパティは、任意の数値データ型に適用することができtinyintsmallintintbigintnumericdecimal)、唯一の制約は、それはので、それは(小数を表すことができなかったということであることができない floatreal、どちらnumericdecimal ゼロ以外のスケール)とofcでは、ID仕様は選択したデータ型と互換性がある必要があります。
2015

2
仕事(外部キーがない場合など)
Andrew Day

3
追加したかったのですが、ID列にデフォルト値をすでに設定している場合、(Is Identity)はグレー表示のままです。デフォルト値を削除すると、再び使用可能になります。
CDspace

7
値を変更できない場合は、[ツール]-[オプション]-[デザイナー]に移動し、[再作成が必要な変更を保存できないようにする]オプションをオフにします。
Jaume 2017年

184

テーブルを作成するときにIDENTITY、次のように列を作成できます。

CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);

IDENTITYプロパティの意志自動インクリメント数1から列まで(列のデータ型は整数にする必要があることに注意。)を使用すると、既存の列にこれを追加したい場合は、使用してALTER TABLEコマンドを。

編集:
少しテストしましたが、さまざまなテーブルの[列のプロパティ]ウィンドウでIDプロパティを変更する方法が見つかりません。列をID列にする場合は、ALTER TABLEコマンドを使用する必要があると思います。


ああ、これは特にSQL Server 2008 r2用です-気にしないでください。
Josien

2
これは、テーブルの構文を作成しているグッドプラクティスの著者によってアドバイスとして 、このコメントでポスト、希望は誰かに役立ちます。
shaijut 2015年

88

増分とシードを公開するには、Identityセクションを展開する必要があります。

ここに画像の説明を入力してください

編集:私はchar(10)ではなく整数データ型を持っていると仮定しました。私がこの回答を投稿したときに私が言うのは妥当であり、有効です


2
yesそのままグレー表示されchar(10)(コメントからわずか掲載)
マーティン・スミスが

@Martin Smithはい、それは一般的な問題のようです。これを変更してテストします。ありがとう
ございます

新しいテーブルを作成するときにBookID int primary key identityシードと増分の両方を指定しませんでしたが、それは良い習慣ですか?MSDNのドキュメントを参照してください。どちらも指定されていない場合、デフォルトは(1,1)です。
Shaijut、2015年

40

データベースを展開し、テーブルを展開してテーブルを右クリックし、ドロップダウンからデザインを選択します。 ITはこんな感じ

次に、その下の列のプロパティに移動し、下にスクロールしてIdentity Specificationを見つけて展開すると、Is IdentityがYesになります。次に、そのすぐ下のIdentity Incrementを選択し、増分する値を指定します。 ここに画像の説明を入力してください


1
これは私にとって正しい答えのようです、データ型をintにするだけではうまくいきませんよね?
ドリューディン2013年

10

おそらく何かが足りないのですが、なぜこれがSEQUENCEオブジェクトで機能しないのですか?これはあなたが探しているものではありませんか?

例:

CREATE SCHEMA blah.
GO

CREATE SEQUENCE blah.blahsequence
START WITH 1
INCREMENT BY 1
NO CYCLE;

CREATE TABLE blah.de_blah_blah
(numbers bigint PRIMARY KEY NOT NULL
......etc

たとえばINSERTコマンドでシーケンスを参照するときは、次のように使用します。

NEXT VALUE FOR blah.blahsequence

SEQUENCEの詳細とオプション


挿入された行の時間順序を気にする場合、このソリューションは正しいものです。IDENTITY時々、ギャップを残してジャンプし、それらのギャップを再び埋めるために戻るためです。したがって、IDENTITY常にincrmenet状態を保証しません
FindOut_Quran

1
@マーティン・スミスおっと、リンクをたどらなかった、私の間違い!MS-SQLに特定の機能がないことに慣れすぎて、より多くのものをサポートする新しいバージョンがあることを時々忘れます。混乱を招く可能性があるため、コメントを削除します...より一般的に表現すると、それは有効ですが、SEQUENCEオブジェクトをサポートしないRDBMS make / versionを使用している可能性があります。 SQL Server 2012がリリースされてから数か月後;)
Paul Groke 2017年

1
@FindOut_Quran IDENTITY列のギャップが埋められていることを確認しますか?私はSQL Server 2005でのみ作業しましたが、そのような状況が発生したことはありませんでした。ギャップが残っているだけです。そして、そのような機能が「少なくとも自由ではない」(パフォーマンス面で)と「望ましくない」(少なくともほとんどのアプリケーションでは)の奇妙な組み合わせになるので、RDBMSでそれが発生するのを見るとかなり驚きます。
ポールグローク2017年

@PaulGrokeはい私は確信しています。トランザクションを使用して1000行を挿入してから、ロールバックしてみることができます。idenetity値はごちゃまぜになります。数千行を挿入してコミットまたはロールバックを試みます。あなたは時々ギャップを埋めるために後退していることに気づくでしょう
FindOut_Quran 2017年

@FindOut_Quranどうしてこうなるのかわかりません。MS SQL IDENTITYカラムは、ユーザー定義可能な値でシードされ、ユーザー定義可能な値によってインクリメントされる単純なカウンターを使用します。クエリを実行してカウンタを再設定することもできます。これが発生していることを確認できる唯一の方法は、並行トランザクションが「順不同」にコミットした場合です。つまり、IDENTITYカウンターを最初にバンプしていたトランザクションは別のトランザクションの後にコミットます。その場合、一時的なギャップが生じ、それが埋められます。これは衝突を避けるために必要です。ただし、IDENTITYカウンタが元に戻ることはありません。
ポールグローク2017年

7

Data Type:intを使用している場合、自動インクリメントする行を選択して、列のプロパティタグに移動できます。そこで、IDを「はい」に設定できます。自動インクリメントの開始値もそこで編集できます。私が助けることができれば幸いです;)


列のプロパティはどこにありますか?

2

私はすでにテーブルを作成していたこの問題がありましたをを削除せずに変更できないそのため、私は何をしましたか(彼らがいつこれを実装したのかはわかりませんが、SQL 2016でそれがありました)。

オブジェクトエクスプローラーでテーブルを右クリックします。

Script Table as > DROP And CREATE To > New Query Editor Window

次に、Josienが言ったスクリプトを編集します。があるところまでスクロールし、CREATE TABLE主キーを見つけてIDENTITY(1,1)、カンマの前の最後に追加します。スクリプトを実行します。

この問題のため、DROPおよびCREATEスクリプトも役に立ちました(生成されたスクリプトが処理するもの。)


1

ID要素をcontigiusにするかどうかに注意してください。SQLSERVER IDは1000ずつジャンプする可能性があるため。

例:再起動前ID = 11再起動後、テーブルに新しい行を挿入すると、IDは1012になります。


1

テーブルを作成するときIDENTITYに、PRIMARY KEY制約とともに列のデータ型としてキーワードを使用できます。
例:

StudentNumber IDENTITY(1,1) PRIMARY KEY

ここで、最初の「1」は開始値を意味し、2番目の「1」は増分値です。


1
CREATE TABLE Persons (
    Personid int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

MS SQL ServerはIDENTITYキーワードを使用して、自動インクリメント機能を実行します。

上記の例では、IDENTITYの開始値は1で、新しいレコードごとに1ずつ増加します。

ヒント:「Personid」列が値10から始まり、5ずつ増加することを指定するには、IDENTITY(10,5)に変更します。

「Persons」テーブルに新しいレコードを挿入するために、「Personid」列に値を指定する必要はありません(一意の値が自動的に追加されます)。


0

テーブルにすでにデータが設定されている場合、列をIDENTITY列に変更したり、非IDENTITY列に変換したりすることはできません。すべてのデータをエクスポートする必要がある場合は、列タイプをIDENTITYまたはその逆に変更してから、データをインポートして戻すことができます。私はそれが苦痛なプロセスであることを知っていますが、この投稿で言及されているようにシーケンスを使用する以外に他に方法はないと信じています。


1
を使用ALTER TABLE ... SWITCHすると、データに一切手を加える必要なく、メタデータを切り替えるだけで済みます。たとえば、データを失うことなくテーブルを作成した後に自動インクリメントを設定する方法を
Martin Smith

1
あなたが提供するリンクで言及されているプロセスは、データを一時テーブルに転送し、上記の私の声明に同意することを含みます。私が間違っている場合は、実際の例を教えてください。
Softec、2017

1
リンクに実用的な例があります。「データを一時テーブルに転送して戻す」ことはできません。`ALTER TABLE ... SWITCH`はメタデータのみの変更です。データは移動されません。
マーティン・スミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.