如何将所有 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份。