2

Azure で既存の主キーを自動インクリメントする方法は?

以下はスキーマのスクリーンショットです

4

2 に答える 2

4

テーブルを最初から再構築する必要があります。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
于 2013-09-25T11:34:00.183 に答える
1

これは、@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
于 2015-04-01T10:51:01.177 に答える