内联和外联约束有什么区别吗

问题描述 投票:0回答:1

内联约束(在名为检查约束的列上)和外行或多列约束之间的性能/内存是否有任何差异。

示例我有一个存储名称的表,我不想在名字和姓氏列中允许空白值,并且我还希望它们每个都是唯一的(这对于名称来说并没有真正意义,但对于示例而言好吧),我的约束方式有什么不同吗?

我可以对列进行内联约束,例如:

create table dbo.People(
    FirstName varchar(50) not null 
        constraint u_FirstName unique
        constraint ck_FirstName_cannot_be_blank check(FirstName <> ''),
    LastName varchar(50) not null 
        constraint u_LastName unique
        constraint ck_LastName_cannot_be_blank check(LastName <> '')
)

或者我可以用逗号分隔

unique
check
约束(这使得它与外线约束相同),例如:

create table dbo.People(
    FirstName varchar(50) not null 
        constraint u_FirstName unique,
        constraint ck_FirstName_cannot_be_blank check(FirstName <> ''),
    LastName varchar(50) not null 
        constraint u_LastName unique,
        constraint ck_LastName_cannot_be_blank check(LastName <> '')
)

它们在性能上有什么区别吗?结合两个检查约束怎么样:

create table dbo.People(
    FirstName varchar(50) not null 
        constraint u_FirstName unique,
    LastName varchar(50) not null 
        constraint u_LastName unique,
    constraint ck_LastName_cannot_be_blank check(FirstName <> '' and LastName <> '')
)

我知道最后一个可能不是首选,因为它不会告诉我问题出在哪一列,但它会影响表的性能/内存吗?

我这么问是因为我确实看到有些人用第二种方法。这是一个代价高昂的错误吗?

sql-server tsql constraints
1个回答
1
投票

我不知道是否可以通过参考 dba.stackexchange.com 来标记为重复,所以我将其作为答案发布在这里。

正如@Martin Smith评论中所说。这个问题在dba.stackexchange中得到了解答。

Paul White 的答案的要点是,当在单个列上声明约束时,它将始终被视为相同。

为了清楚起见,使用哪种语法来声明或添加约束并不重要。在表级别声明但仅引用单个列的检查约束将被视为列级约束。同样,仅引用创建表后添加的单个列的检查约束将被添加为列级约束。

© www.soinside.com 2019 - 2024. All rights reserved.