内联约束(在名为检查约束的列上)和外行或多列约束之间的性能/内存是否有任何差异。
示例我有一个存储名称的表,我不想在名字和姓氏列中允许空白值,并且我还希望它们每个都是唯一的(这对于名称来说并没有真正意义,但对于示例而言好吧),我的约束方式有什么不同吗?
我可以对列进行内联约束,例如:
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 <> '')
)
我知道最后一个可能不是首选,因为它不会告诉我问题出在哪一列,但它会影响表的性能/内存吗?
我这么问是因为我确实看到有些人用第二种方法。这是一个代价高昂的错误吗?
我不知道是否可以通过参考 dba.stackexchange.com 来标记为重复,所以我将其作为答案发布在这里。
正如@Martin Smith在评论中所说。这个问题在dba.stackexchange中得到了解答。
Paul White 的答案的要点是,当在单个列上声明约束时,它将始终被视为相同。
为了清楚起见,使用哪种语法来声明或添加约束并不重要。在表级别声明但仅引用单个列的检查约束将被视为列级约束。同样,仅引用创建表后添加的单个列的检查约束将被添加为列级约束。