如何在SQL Server中为用户定义的表类型添加索引或主键?

Rob*_*ood 30 sql-server

我有这个用户定义的类型,我想添加一个主键或索引:

IF NOT EXISTS (
  SELECT * 
  FROM sys.types st 
  JOIN sys.schemas ss 
    ON st.schema_id = ss.schema_id 
  WHERE st.name = N'DistCritGroupData' 
    AND ss.name = N'dbo')
BEGIN

  CREATE TYPE [dbo].[DistCritGroupData] AS TABLE
  (
    [DistCritTypeId] [int] NOT NULL,
    [ItemAction] [int] NOT NULL,        
    [ObjectId] [int] NOT NULL,
    [OperatorType] [int] NOT NULL     
  );

END;
GO  
Run Code Online (Sandbox Code Playgroud)

我基本上想要添加主键或聚簇索引.我试过这个,但是我收到错误'找不到对象"dbo.DistCritGroupData",因为它不存在或者你没有权限.

  CREATE TYPE [dbo].[DistCritGroupData] AS TABLE
  (
    [DistCritTypeId] [int] NOT NULL,
    [ItemAction] [int] NOT NULL,        
    [ObjectId] [int] NOT NULL,
    [OperatorType] [int] NOT NULL,
    CONSTRAINT [DistCritGroupData0] PRIMARY KEY CLUSTERED 
    (
       [DistCritTypeId] ASC
    )        
  );
Run Code Online (Sandbox Code Playgroud)

我在用户定义的表类型的对象资源管理器中看到,有"列","键","约束"和"索引"的部分.问题是,我如何添加密钥或索引?

gbn*_*gbn 49

为什么不呢?

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE
  (
    [DistCritTypeId] [int] NOT NULL PRIMARY KEY CLUSTERED,
    [ItemAction] [int] NOT NULL,        
    [ObjectId] [int] NOT NULL,
    [OperatorType] [int] NOT NULL     
  );
Run Code Online (Sandbox Code Playgroud)

要么

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE
  (
    [DistCritTypeId] [int] NOT NULL,
    [ItemAction] [int] NOT NULL,        
    [ObjectId] [int] NOT NULL,
    [OperatorType] [int] NOT NULL,
    PRIMARY KEY CLUSTERED ([DistCritTypeId] ASC)        
  );
Run Code Online (Sandbox Code Playgroud)

CREATE TYPE不允许命名约束.像表变量一样.


Dam*_*ver 19

@bernd_K和@ gbn的答案是有效的,如果它是单列PK.对于多列,它将是:

CREATE TYPE [dbo].[DistCritGroupData] AS TABLE
  (
    [DistCritTypeId] [int] NOT NULL,
    [ItemAction] [int] NOT NULL,        
    [ObjectId] [int] NOT NULL,
    [OperatorType] [int] NOT NULL,
    PRIMARY KEY (ColumnA,ColumnB)
  );
Run Code Online (Sandbox Code Playgroud)

简而言之,您可以拥有PK和UNIQUE 表约束,但您无法命名它们.这是有道理的,因为您将要创建多个相同类型的对象,并且您唯一想要使用这些约束的时间将是对整个表类型的更改.

您也无法定义索引,因为这些索引主要是围绕物理存储的工件.


Mar*_*wul 7

值得注意的是,您现在可以使用新的内联索引语法在 SQL 2014 中的表类型中添加某些索引。例如:

  CREATE TYPE [dbo].[DistCritGroupData] AS TABLE
  (
    [DistCritTypeId] [int] NOT NULL UNIQUE,
    [ItemAction] [int] NOT NULL,        
    [ObjectId] [int] NOT NULL,
    [OperatorType] [int] NOT NULL,

    PRIMARY KEY NONCLUSTERED 
    (
       [ObjectId] ASC
    ),

    INDEX CIX CLUSTERED (ObjectId, OperatorType)    
  );
Run Code Online (Sandbox Code Playgroud)


ber*_*d_k 5

您可以像这样指定您的类型:

  CREATE TYPE [dbo].[DistCritGroupData] AS TABLE
  (
    [DistCritTypeId] [int] NOT NULL primary key,
    [ItemAction] [int] NOT NULL,        
    [ObjectId] [int] NOT NULL,
    [OperatorType] [int] NOT NULL
  );
Run Code Online (Sandbox Code Playgroud)

我从来不知道为什么数据库人员需要主键名称。它们应该被称为表 xyz 的主键。

  • 使用源代码管理时,您需要一个命名键或约束。那么命名键或约束就非常有帮助。 (4认同)