如何将所有 ID 字段设置为主键?
How can I set all ID fields to primary key?
我在 SQL 服务器中有 15 个表。它们每个都有一个 ID (int) 列。如何在简短或单个 SQL 查询中将所有这些 ID 字段设置为 PRIMARY KEY 和 AUTOINCREMENT?
执行此操作所需的脚本实际上并不简单,但非常复杂。幸运的是,SMSS 可以为您生成它(基于您对 1 table 所做的更改)。然后您可以复制该脚本,为每个 table 调整这些副本,然后 运行 它们。
步骤:
确保您禁用了 SSMS 选项“防止保存需要 table re-creation 的更改”:
然后,在 Table 设计器中为您的 table 中的 1 个进行必要的更改。
不要按工具栏中的保存按钮 - 相反,在设计器中右键单击 window 并选择选项 生成更改脚本 :
保存 SQL 文件,它看起来像这样:
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
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_Table1
(
ID int NOT NULL IDENTITY (1, 1)
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Table1 SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_Table1 ON
GO
IF EXISTS(SELECT * FROM dbo.Table1)
EXEC('INSERT INTO dbo.Tmp_Table1 (ID)
SELECT ID FROM dbo.Table1 WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_Table1 OFF
GO
DROP TABLE dbo.Table1
GO
EXECUTE sp_rename N'dbo.Tmp_Table1', N'Table1', 'OBJECT'
GO
ALTER TABLE dbo.Table1 ADD CONSTRAINT
PK_Table1 PRIMARY KEY CLUSTERED
(
ID
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
制作 15 个脚本文件副本,然后在每个副本中用您要处理的相应 15 个 table 名称替换 Table1
(或为您保存的任何内容) .
同时编辑每个脚本以插入...SELECT 每个 table 的正确列,如果您的 table 已经包含数据。
运行 15份。
我在 SQL 服务器中有 15 个表。它们每个都有一个 ID (int) 列。如何在简短或单个 SQL 查询中将所有这些 ID 字段设置为 PRIMARY KEY 和 AUTOINCREMENT?
执行此操作所需的脚本实际上并不简单,但非常复杂。幸运的是,SMSS 可以为您生成它(基于您对 1 table 所做的更改)。然后您可以复制该脚本,为每个 table 调整这些副本,然后 运行 它们。
步骤:
确保您禁用了 SSMS 选项“防止保存需要 table re-creation 的更改”:
然后,在 Table 设计器中为您的 table 中的 1 个进行必要的更改。
不要按工具栏中的保存按钮 - 相反,在设计器中右键单击 window 并选择选项 生成更改脚本 :
保存 SQL 文件,它看起来像这样:
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ 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_Table1 ( ID int NOT NULL IDENTITY (1, 1) ) ON [PRIMARY] GO ALTER TABLE dbo.Tmp_Table1 SET (LOCK_ESCALATION = TABLE) GO SET IDENTITY_INSERT dbo.Tmp_Table1 ON GO IF EXISTS(SELECT * FROM dbo.Table1) EXEC('INSERT INTO dbo.Tmp_Table1 (ID) SELECT ID FROM dbo.Table1 WITH (HOLDLOCK TABLOCKX)') GO SET IDENTITY_INSERT dbo.Tmp_Table1 OFF GO DROP TABLE dbo.Table1 GO EXECUTE sp_rename N'dbo.Tmp_Table1', N'Table1', 'OBJECT' GO ALTER TABLE dbo.Table1 ADD CONSTRAINT PK_Table1 PRIMARY KEY CLUSTERED ( ID ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO COMMIT
制作 15 个脚本文件副本,然后在每个副本中用您要处理的相应 15 个 table 名称替换
Table1
(或为您保存的任何内容) .同时编辑每个脚本以插入...SELECT 每个 table 的正确列,如果您的 table 已经包含数据。
运行 15份。