Sql 自动添加主键约束

Sql 自动添加主键约束,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下表InfoSchema,其中包含测试数据库中每个表的SchemaName和TableName: SchemaName TableName dbo Employee dbo Department Function Company Finance Payslips Sub ProjectSub 我想为每个表添加约束PrimaryKey到以ID或ID结尾的列: 在dbo.Employee中有一列EmployeeId,因此查询如下: ALTER

我有下表InfoSchema,其中包含测试数据库中每个表的SchemaName和TableName:

SchemaName TableName
dbo        Employee
dbo        Department
Function   Company
Finance    Payslips
Sub        ProjectSub
我想为每个表添加约束PrimaryKey到以ID或ID结尾的列: 在dbo.Employee中有一列EmployeeId,因此查询如下:

ALTER TABLE dbo.Employee
ADD CONSTRAINT Employee_pk PRIMARY KEY (EmployeeId);
对于Sub.ProjectSub,有3列以Id结尾:

  • 投射
  • 公司ID
  • SubId

约束将添加到表结构中出现的第一列。

不可能。SQL Server中没有自动执行此操作,因此至少需要一个脚本在db上运行,以标识表和列并发出modify语句。它不是“自动”的,因为它不会自动运行-您需要在第二步中运行它。

正如我在评论中提到的,您可以使用动态语句来创建语句。但是,我非常强烈地建议查看生成的SQL,因此我不在这里包含
EXEC sp_executesql
语句
PRINT
选择
@SQL
的值并首先检查它,然后根据需要运行语句:

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

SET @SQL = STUFF((SELECT @CRLF + @CRLF +
                         N'ALTER TABLE ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name]) + @CRLF +
                         N'ADD CONSTRAINT ' + QUOTENAME(CONCAT(t.[name],N'_PK')) + N' PRIMARY KEY (' + QUOTENAME(c.[name]) + N');'
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       CROSS APPLY (SELECT TOP 1 *
                                    FROM sys.columns c
                                    WHERE c.object_id = t.object_id
                                      AND c.name LIKE '%id'
                                    ORDER BY c.column_id ASC) c
                 WHERE NOT EXISTS (SELECT 1
                                   FROM sys.key_constraints k
                                   WHERE k.[type] = 'PK'
                                     AND k.parent_object_id = t.object_id)
                 FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,4,N'');

PRINT @SQL;

这假设第一列(通常)需要是PK,并且它不会尝试在已经有PK的表上创建PK。

您可以使用动态SQL执行此操作,并扫描数据库中的表,但是,我承认我强烈建议不要这样做,如果你走这条路,我强烈建议你首先检查它生成的SQL。但是对于5个表,只需要自己编写SQL。如果您正在创建表,为什么不在
CREATE
脚本中包含PK的定义呢?@larn我可能有点懒,但是表已经创建了,因为我不负责暂存任务。然后您只需要编写5个
ALTER
语句。这将比写动态语句快得多。@Larnu大约有100多个表。这确实回答了所提出的问题,并且就应该接受的关注点而言。