web-dev-qa-db-ja.com

SQL Serverは自動インクリメントの主キーを既存のテーブルに追加します

タイトルとして、私はすでに150000のレコードが入っている既存のテーブルを持っています。 Id列を追加しました(現在はnullです)。

この列に増分値を入力してから主キーとして設定し、自動増分を有効にするクエリを実行できると思います。これは正しいやり方ですか?そして、もしそうなら、どうやって最初の数字を埋めますか?

213

いいえ-あなたはそれを他の方法で行う必要があります:get go as INT IDENTITYとしてすぐに追加します-これを行うとアイデンティティ値で満たされます:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

そして、それを主キーにすることができます:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

または、すべてを1ステップで実行する場合:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED
385
marc_s

あなたはIDENTITYを "オン"にすることはできません:それはテーブルの再構築です。

番号の順序を気にしないのであれば、NOT NULLの列にIDENTITYを1回で追加します。 150k行はそれほど多くありません。

番号順を維持する必要がある場合は、それに応じて番号を追加します。次に、SSMSテーブルデザイナーを使用してIDENTITYプロパティを設定します。これにより、カラムドロップ/追加/番号の保持/再シードを実行するスクリプトを生成できます。

18
gbn

私はこの問題を抱えていましたが、ID列を使用できませんでした(さまざまな理由で)。私はこれに決着しました:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

ここ から借りた。

11
Kevin

列がすでにテーブルに存在し、それがnullの場合は、次のコマンドで列を更新できます(replace id、tablename、およびtablekey)。

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x
4
Renzo Ciot

既存のテーブルにidentity列を追加すると、自動的に値が設定されますが、手動で設定する必要はありません。

2
user3279092

デザイナーによって、IDを設定することができます(1,1)テーブルを右クリック=>デザイン=>左の一部(右クリック)=>プロパティ=> IDの列を選択#column

プロパティ

識別列

2
gustavo herrera

あなたのテーブルが、その主キーまたはforiegenキーを使って他のテーブルと関係を持っている場合、あなたのテーブルを変更することは不可能かもしれません。そのため、もう一度テーブルを削除して作成する必要があります。
これらの問題を解決するには、データベースを右クリックしてスクリプトを生成する必要があります。詳細オプションでは、スクリプト化するデータの種類をスキームとデータに設定します。その後、このスクリプトを使用して列を変更し、クエリを実行してテーブルを識別して再生成します。
あなたの質問は以下のようになります。

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 
1
Hamid

この回答は、最高得票数の回答に対する小さな追加であり、SQL Serverに有効です。質問が主キーの自動インクリメントを要求しました。現在の回答は主キーを追加しますが、自動インクリメントとしてフラグが立てられていません。以下のスクリプトはカラム、存在をチェックし、autoincrementフラグを有効にしてそれを追加します。

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO
0
John K.

これはあなたが試すことができる考えです。元のテーブル - ID列table1が新しいテーブルを作成しない - ID列と共にtable2を呼び出します。 table1からtable2にデータをコピーします - 識別列には自動増分番号が自動的に入力されます。

元のテーブルの名前を変更する - table1からtable3新しいテーブルの名前を変更する - table2からtable1(元のテーブル)これで、ID1列を持つテーブル1が作成され、既存のデータが入力されます。問題がないことを確認して正しく機能した後、不要になったらtable3を削除します。

0
JH326

異なる名前と同じ列、主キーと外部キーの関連付けを使用して新しいテーブルを作成し、これをInsertコード内でリンクします。 E.gの場合:EMPLOYEEの場合は、EMPLOYEESに置き換えます。

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

ただし、既存の従業員テーブルを削除するか、必要に応じて調整する必要があります。

0
kumarP