タイトルとして、すでに150000レコードが入力されている既存のテーブルがあります。Id列(現在はnull)を追加しました。
クエリを実行してこの列に増分番号を入力し、主キーとして設定して自動増分をオンにできると仮定しています。これは続行する正しい方法ですか?もしそうなら、どうすれば最初の数字を埋めることができますか?
タイトルとして、すでに150000レコードが入力されている既存のテーブルがあります。Id列(現在はnull)を追加しました。
クエリを実行してこの列に増分番号を入力し、主キーとして設定して自動増分をオンにできると仮定しています。これは続行する正しい方法ですか?もしそうなら、どうすれば最初の数字を埋めることができますか?
回答:
いいえ-逆の方法で行う必要があります。getgo asから直接追加しINT IDENTITY
ます。これを行うと、ID値が入力されます。
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
alter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
PRIMARY KEY
が適切に行われていることを意味します。つまり、NOT NULL
絶対に必要というわけではありません。しかし、私は明示的にすることを好むのでNOT NULL
、絶対に明確にするために、常にそこにいます
PRIMARY KEY
と、クラスター化インデックスが自動的に作成されます(明示的に指定しない限りNONCLUSTERED
)
IDENTITYを「オンにする」ことはできません。これはテーブルの再構築です。
番号の順序を気にしない場合は、IDENTITYを使用してNOT NULL列を一度に追加します。15万行は多くありません。
番号の順序を維持する必要がある場合は、それに応じて番号を追加します。次に、SSMSテーブルデザイナを使用してIDENTITYプロパティを設定します。これにより、列のドロップ/追加/番号の保持/再シードを実行するスクリプトを生成できます。
ALTER TABLE ... SWITCH
できませんが、それがなくても実行できます。
既存のテーブルに列を追加して識別すると、列に自動的に入力されるため、手動で入力する必要はありません。
テーブルが主キーまたは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
異なる名前と同じ列、主キーと外部キーの関連付けで新しいテーブルを作成し、これをコードのInsertステートメントでリンクします。例: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)
)
ただし、既存のEMPLOYEEテーブルを削除するか、要件に応じて調整する必要があります。
この回答は、最高得票数の回答への小さな追加であり、SQL Serverで機能します。質問で自動インクリメントの主キーが要求されました。現在の回答では主キーが追加されていますが、自動インクリメントのフラグは付けられていません。以下のスクリプトは、列の存在を確認し、自動インクリメントフラグを有効にして追加します。
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
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1)
update
テーブルの変更/ **テーブルの名前を貼り付け** / add ID int IDENTITY(1,1)
/ **から削除し、見出しの名前を貼り付けます** / where id in
(
選択a.id FROM / **表の名前を貼り付けます/ LEFT OUTER JOINとして(SELECT MIN(id)as id FROM /表の名前を 貼り付け/ GROUP BY /列c1、c2 ...を貼り付けます** /
) as t1
ON a.id = t1.id
WHERE t1.id IS NULL
)
表の変更/ **表の名前を貼り付け** / DROP COLUMN id
このようなものを試してください(最初にテストテーブルで):
your_database_nameを使用 行く WHILE(SELECT COUNT(*)FROM your_table WHERE your_id_field IS NULL)> 0 ベギン 行カウントを設定1 UPDATE your_table SET your_id_field = MAX(your_id_field)+1 終わり 「すべて完了」の印刷
私はこれをまったくテストしていませんので、注意してください!
IDENTITY
列の追加に関する)質問に回答せず、とにかく機能しません。そこにUPDATE your_table SET your_id_field = MAX(your_id_field)+1
こだわることはできませんMAX
。WHERE
同じ行を繰り返し更新することを避けるための句はどこにありますか?
ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1
が、専門家に確認せずに試したくありませんでした:)参照。 pic.dhe.ibm.com/infocenter/iseries/v7r1m0/...