如何在 Azure 中自动增加现有主键?
问问题
7411 次
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 回答