タイトルとして、私はすでに150000のレコードが入っている既存のテーブルを持っています。 Id列を追加しました(現在はnullです)。
この列に増分値を入力してから主キーとして設定し、自動増分を有効にするクエリを実行できると思います。これは正しいやり方ですか?そして、もしそうなら、どうやって最初の数字を埋めますか?
いいえ-あなたはそれを他の方法で行う必要があります: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
あなたはIDENTITYを "オン"にすることはできません:それはテーブルの再構築です。
番号の順序を気にしないのであれば、NOT NULLの列にIDENTITYを1回で追加します。 150k行はそれほど多くありません。
番号順を維持する必要がある場合は、それに応じて番号を追加します。次に、SSMSテーブルデザイナーを使用してIDENTITYプロパティを設定します。これにより、カラムドロップ/追加/番号の保持/再シードを実行するスクリプトを生成できます。
私はこの問題を抱えていましたが、ID列を使用できませんでした(さまざまな理由で)。私はこれに決着しました:
DECLARE @id INT
SET @id = 0
UPDATE table SET @id = id = @id + 1
ここ から借りた。
列がすでにテーブルに存在し、それが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
既存のテーブルにidentity列を追加すると、自動的に値が設定されますが、手動で設定する必要はありません。
あなたのテーブルが、その主キーまたは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
この回答は、最高得票数の回答に対する小さな追加であり、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
これはあなたが試すことができる考えです。元のテーブル - ID列table1が新しいテーブルを作成しない - ID列と共にtable2を呼び出します。 table1からtable2にデータをコピーします - 識別列には自動増分番号が自動的に入力されます。
元のテーブルの名前を変更する - table1からtable3新しいテーブルの名前を変更する - table2からtable1(元のテーブル)これで、ID1列を持つテーブル1が作成され、既存のデータが入力されます。問題がないことを確認して正しく機能した後、不要になったらtable3を削除します。
異なる名前と同じ列、主キーと外部キーの関連付けを使用して新しいテーブルを作成し、これを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)
)
ただし、既存の従業員テーブルを削除するか、必要に応じて調整する必要があります。