Microsoft SQL Server:使用生成的名称检查约束



在 T-SQL 中,通常最好命名创建的所有约束,包括检查约束。

alter table mytable with check 
add constraint myconstraint check (mycol > 0)

如果您不提供显式名称 (myconstraint),则服务器将为您生成一个唯一的名称,该名称在错误消息中不是特别可读。

或者每个人都这么说。但是,是否可以为检查约束获取此生成的名称?我已经看到了外键约束和唯一约束,但我不知道如何在不指定名称的情况下创建检查约束。

如果我省略了上述 T-SQL 中的名称myconstraint,则这是一个语法错误。

我问的原因是 tempdb 中的检查约束。临时表的名称是按会话的,因此将表称为#x是没有问题的。您可以在多个不同的程序(或同一程序的多个实例同时运行)中使用该名称,并且它们不会发生冲突。只有全局临时表(如##x)需要具有全局唯一的名称。

但是,约束名称在 tempdb 中必须是唯一的,并且不是每个会话的。因此,如果您为它们提供一个可读的名称,您将面临在其他连接中与相同名称发生冲突的风险。你需要做一些事情来使其全局唯一,要么在客户端粘贴一些垃圾,要么诉诸动态SQL。我非常希望不指定名称,并让服务器处理命名约束的工作,就像我在临时表上创建唯一索引时已经发生的那样。

如何在不指定名称的情况下创建检查约束?

Microsoft SQL Server 2016 (SP2-CU15-GDR) (KB4583461) - 13.0.5865.1 (X64)

也许你的语法是错误的(你没有向我们展示)。只是

ALTER TABLE elbat
WITH CHECK
ADD CHECK (nmuloc = 1);

应该工作正常,SQL Server将生成一个名称。

显式创建CONSTRAINT时,必须指定一个名称。当您隐式创建CONSTRAINT时,您将获得一个具有自动名称的。

采用以下 DDL 语句:

CREATE TABLE dbo.MyTable (ID int IDENTITY PRIMARY KEY,
SomeDate date DEFAULT GETDATE(),
SomeInt int DEFAULT 1 CHECK (SomeInt> 0));

上面创建了一个表,有 3 列,但也有4CONSTRAINT。这些约束是:

  • ID上的主键约束
  • SomeDate的默认约束
  • SomeInt的默认约束 ,
  • SomeInt的检查约束。

我们可以通过查看sys对象来验证这一点:

SELECT N'Key Constraint', [name] AS ConstraintName
FROM sys.key_constraints kc
WHERE parent_object_id = OBJECT_ID(N'dbo.MyTable')
UNION ALL
SELECT N'Default Constraint', [name] AS ConstraintName
FROM sys.default_constraints 
WHERE parent_object_id = OBJECT_ID(N'dbo.MyTable')
UNION ALL
SELECT N'Check Constraint', [name] AS ConstraintName
FROM sys.check_constraints
WHERE parent_object_id = OBJECT_ID(N'dbo.MyTable');

当我运行这个时,这生成了生成的名称是:

约束
类型约束名称
关键约束PK__MyTable__3214EC27B4E6D2B3
默认约束DF__MyTable__SomeDat__6A33284E
检查约束CK__MyTable__SomeInt__6B274C87

相关内容

  • 没有找到相关文章

最新更新