我有一个用户定义的类型,我想向其中添加主键或索引:
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
我基本上想添加主键或聚集索引。我尝试了此操作,但收到错误“找不到对象“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
)
);
我在用户定义的表类型的对象资源管理器中看到有“列”、“键”、“约束”和“索引”部分。问题是,如何添加键或索引?
SQL服务器CREATE TYPEDDL语句 https://learn.microsoft.com/en-us/sql/t-sql/statements/create-type-transact-sql支持至少两种不同的声明方式PRIMARY KEY
约束和其他选项。
-
最简单的是内联PRIMARY KEY
单列上的修饰符 (see the <column_definition>语法规则 https://learn.microsoft.com/en-us/sql/t-sql/statements/create-type-transact-sql#syntax,以及CLUSTERED
/NONCLUSTERED
关键字是可选的)。
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
);
-
注意UNIQUE
and CHECK
约束也可以在单个列上声明。例如:
CREATE TYPE dbo.DistCritGroupData AS TABLE (
DistCritTypeId int NOT NULL PRIMARY KEY CLUSTERED,
ItemAction int NOT NULL,
ObjectId int NOT NULL UNIQUE,
OperatorType int NOT NULL CHECK ( OperatorType >= 1 AND OperatorType <= 10 )
);
-
您还可以声明PRIMARY KEY
, UNIQUE
, and CHECK
约束条件作为表类型约束,位于列定义之后:
-
如果您有复合材料,则必须使用此方法PRIMARY KEY
- 或者如果您想在您的UNIQUE
or CHECK
约束。
-
与正常情况不同CREATE TABLE
声明这些约束总是匿名的并且缺乏CONSTRAINT
关键词。
- 即仅使用
PRIMARY KEY ( DistCritTypeId, ItemAction )
but not CONSTRAINT PK_DistCritGroupData PRIMARY KEY ( DistCritTypeId, ItemAction )
.
CREATE TYPE dbo.DistCritGroupData AS TABLE (
DistCritTypeId int NOT NULL,
ItemAction int NOT NULL,
ObjectId int NOT NULL,
OperatorType int NOT NULL,
PRIMARY KEY ( DistCritTypeId ),
UNIQUE ( ObjectId ),
CHECK ( OperatorType >= 1 AND OperatorType <= 10 )
);
-
您还可以指定额外的任意INDEX
对象,这些对象在之后声明PRIMARY KEY
约束(如果有)。
-
Unlike CREATE TABLE
DDL语句,不能使用CREATE INDEX
定义表类型的索引;这INDEX
定义must成为其中的一部分CREATE TYPE
陈述。
-
另外,与PRIMARY KEY
, CHECK
, and UNIQUE
到目前为止我们所看到的限制,INDEX
表类型上的对象are not匿名的。
CREATE TYPE dbo.DistCritGroupData AS TABLE (
DistCritTypeId int NOT NULL,
ItemAction int NOT NULL,
ObjectId int NOT NULL,
OperatorType int NOT NULL,
PRIMARY KEY ( DistCritTypeId ),
INDEX IX_ObjectId_OperatorType ( ObjectId, OperatorType )
);
-
注意没有FOREIGN KEY
这里的约束类型:表类型不能参与外键约束。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)