拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 MicrosoftSQLServer:使用生成的名称检查约束

MicrosoftSQLServer:使用生成的名称检查约束

白鹭 - 2022-02-10 2103 0 0

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

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

如果您不提供明确的名称 ( myconstraint),那么服务器将为您生成一个唯一的名称,该名称在错误讯息中不是特别可读。

或者每个人都这幺说。但是甚至有可能为检查约束获得这个生成的名称吗?我已经看到它用于外键约束和唯一约束,但我不知道如何在不指定名称的情况下创建检查约束。

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

我问的原因是在 tempdb 中检查约束。临时表的名称是每个会话的,所以呼叫你的 table 没有问题#x您可以在多个不同的程序(或同时运行的同一程序的多个实体)中使用该名称,并且它们不会发生冲突。只有全域临时表 (as ##x) 需要具有全域唯一名称。

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

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

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

uj5u.com热心网友回复:

也许您的语法错误(您没有向我们展示)。简单地

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

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

uj5u.com热心网友回复:

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

采取以下 DDL 陈述句:

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

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

  • 主键约束 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

这并不意味着您在创建CONSTRAINT表的 DDL时不能显式提供名称如果要将它们定义为列的一部分,则如下所示:

CREATE TABLE dbo.OtherTable (ID int IDENTITY CONSTRAINT PK_OtherTable PRIMARY KEY,
                             SomeDate date CONSTRAINT DF_OtherTable_SomeDate DEFAULT GETDATE(),
                             SomeInt int CONSTRAINT DF_OtherTable_SomeInt DEFAULT 1
                                         CONSTRAINT chk_OtherTable_SomeInt CHECK (SomeInt> 0));
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *