ID列を持つテーブルを作成する方法


111

ID列をテーブルのID列に設定して作成しなかったため、吹き飛ばそうとしている既存のテーブルがあります。

SQL Server Management Studioを使用して、既存のテーブルの"Create To ..."をスクリプト化し、これを取得しました。

CREATE TABLE [dbo].[History](
    [ID] [int] NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

私の質問は、SQL結果のテーブルにID列がIDとして設定されるようにこれをどのように変更するのですか?


11
[ID] [int] NOT NULL IDENTITY(1,1)
Li0liQ

回答:


153
CREATE TABLE [dbo].[History](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
) ON [PRIMARY]

1
それが私が探していたものだと思います。PK_History値をID何かに変更する必要はありませんか?
jp2code

いいえ、それだけで十分です。PK_Historyは、主キー制約が既に列IDにある制約の名前にすぎません
Gratzy

1
パラメータのIDENTITYの意味は、(1,1)何である
OTC

4
アイデンティティ(シード、インクリメント)docs.microsoft.com/en-us/sql/t-sql/statements/...
Gratzy

33

これはすでに回答されていますが、最も簡単な構文は次のとおりです。

CREATE TABLE History (
    ID int primary key IDENTITY(1,1) NOT NULL,
    . . .

より複雑な制約インデックスは、実際にオプションを変更したい場合に役立ちます。

ちなみに、このような列にはHistoryIdという名前を付けることをお勧めします。これにより、外部キーリレーションシップの列の名前と一致します。


5
OPは、既存のオブジェクトのDDLを出力するGUIツールの出力を具体的に処理しています。そのツールにはおそらく「可能であればより単純な構文を使用する」オプションはありません。OPの特定の状況で最もエラーが発生しやすいのは、生成されたDDLの1行を編集することであり、最も単純な構文を使用して最初から記述しようとはしません。また、指定した例では、OPのようにPK制約に名前を割り当てていません。多くの人は、すべての環境(dev、test、prod)で同じ名前になるように名前を付けた私の制約を好みます。ID int constraint PK_History primary key identity(1,1)私は信じている。
シャノン退職

3
多分そうでないかもしれません。私は、あるデータベースからスクリプトを取得して別のサーバーで使用し、ある場所で機能するデフォルトが他の場所では最適ではない状況にありました。いずれにせよ、これは私には簡単に思えるので、これを解決策として提案しただけです(「主キー」キーワードは、制約のオプションを理解するよりもはるかによく理解しており、「悪い」と理解していないオプションの使用を検討しています")。ただし、別のソリューションが推奨される理由については、十分に説明します。付け加えておきますが、その答えはすでに受け入れられています。
Gordon Linoff

@GordonLinoff:メイト、主キーはデフォルトではnullではないのに、ここでnot nullを明示的に指定する必要があるのはなぜですか?
学習者

@学習者。。。どちらの制約もOPのコードに含まれていました。NOT NULL冗長です。
ゴードンリノフ2018

12
[id] [int] IDENTITY(1,1) NOT NULL,

もちろん、SQL Server Management Studioでテーブルを作成しているので、テーブルデザイナーを使用してID仕様を設定できます。

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


1
まあ、フィルに感謝します。私はそれを行う方法を知っていますが、テーブルがすでにそこにあるので私はできません。テーブルを削除して再作成する必要があるため、なぜスクリプトを使用しているのですか。
jp2code

4
@ jp2code:つまり、Identity列を持つテストテーブルを作成し、それをスクリプト化して、指定方法を確認することができます。
フィル

-2

一意のキーでは、最大2つのNULL値が許可されます。説明:

create table teppp
(
id int identity(1,1) primary key,
name varchar(10 )unique,
addresss varchar(10)
)

insert into teppp ( name,addresss) values ('','address1')
insert into teppp ( name,addresss) values ('NULL','address2')
insert into teppp ( addresss) values ('address3')

select * from teppp
null string , address1
NULL,address2
NULL,address3

以下と同じ値を挿入しようとすると、

insert into teppp ( name,addresss) values ('','address4')
insert into teppp ( name,addresss) values ('NULL','address5')
insert into teppp ( addresss) values ('address6')

次のようなエラーが発生するたびに:

一意キー制約 'UQ__teppp__72E12F1B2E1BDC42'の違反。オブジェクト 'dbo.teppp'に重複するキーを挿入することはできません。
ステートメントは終了されました。


ID列ではなく、列を一意にする必要がありましたName。列に一意制約を追加したのはなぜNameですか?それはあなたのtepppテーブルでどのようにあなたに利益をもたらしますか?
jp2code 2016年

1
ここでのQに対する答えはまったくありません
Martin Smith、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.