Azure で既存の主キーを自動インクリメントする方法は?
2 に答える
テーブルを最初から再構築する必要があります。auto_increment を既存のテーブルに割り当てることはできません。auto_increment を使用してテーブルを作成し、古いテーブルから新しいテーブルにすべてのデータを転送し、古いテーブルを削除して、新しいテーブルの名前を古いテーブルに変更するこのスクリプトを試してください。
データが auto_increment プロパティと互換性があることを確認してください!
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_schema_version
(
version int NULL,
datetime datetime NULL,
comments nvarchar(150) NULL,
id int NOT NULL IDENTITY (1, 1)
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_schema_version SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_schema_version ON
GO
IF EXISTS(SELECT * FROM dbo.schema_version)
EXEC('INSERT INTO dbo.Tmp_schema_version (version, datetime, comments, id)
SELECT version, datetime, comments, id FROM dbo.schema_version WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_schema_version OFF
GO
DROP TABLE dbo.schema_version
GO
EXECUTE sp_rename N'dbo.Tmp_schema_version', N'schema_version', 'OBJECT'
GO
ALTER TABLE dbo.schema_version ADD CONSTRAINT
PK_schema_version PRIMARY KEY CLUSTERED
(
id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
これは、@Dieter Gobeynのソリューションとほぼ同じ方法です。後でフォローしました。
自動インクリメントをオンにして一時テーブルを作成します
CREATE TABLE [dbo].[schema_version_new](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Version] [int] NULL,
[DateTime] [datetime] NULL,
[Comments] [nvarchar](150) NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)
) ON [PRIMARY]
GO
古いテーブルから新しく作成されたテーブルにすべてをコピーします。ID を古いテーブルから意図的に残しました。自動インクリメント ID を新しいテーブルに配置したので、そこに ID を配置する必要はありません。古いテーブルの ID を保持する必要がある場合は、SET IDENTITY_INSERT dbo.schema_version_new OFF
行を挿入するときに ID を含め、挿入後、identity_insert を再度オンにする必要があります " SET IDENTITY_INSERT dbo.schema_version_new ON
"。新しい挿入の場合、自動 ID が取得されます。
INSERT INTO [schema_version_new]([Version], [Datetime], [Comments])
SELECT [Version], [Datetime], [Comments] FROM [schema_version]
古いテーブルを削除します。
DROP TABLE [dbo].[schema_version]
GO
新しいテーブルの名前を古いテーブルの名前に変更します。
EXECUTE sp_rename N'dbo.schema_version_new', N'schema_version', 'OBJECT'
GO