SQL Server中的列级别与表级别约束?

mr_*_*air 10 sql sql-server

一个.列级别

GO

CREATE TABLE Products
(
ProductID INT CONSTRAINT pk_products_pid PRIMARY KEY,
ProductName VARCHAR(25)
);

GO
Run Code Online (Sandbox Code Playgroud)

湾 表级别

CREATE TABLE Products
(
ProductID INT,
ProductName VARCHAR(25),
CONSTRAINT pk_products_pid PRIMARY KEY(ProductID)
);
GO 
Run Code Online (Sandbox Code Playgroud)

列级别和表级别约束之间有什么区别吗?

mar*_*c_s 13

不.你应用约束只是个人品味的问题.

主键约束只是一个主键约束 - 它总是应用于(毕竟:它可能包含多个列 - 它不能"在列级别").

它不是"在列级"一次或在另一种情况下的"表级" - 它始终是相同的.

只是为了好玩 - 您还可以通过第三种方式创建主键约束:

(CREATE TABLE statement)
GO

ALTER TABLE dbo.Products
ADD CONSTRAINT PK_Products_pid PRIMARY KEY(ProductID)
Run Code Online (Sandbox Code Playgroud)

而且这又与你已经拥有的其他两个选项相同.


one*_*hen 8

您的第一个示例在行中声明约束,第二个示例没有.只有简单的键(涉及一个属性)可以在行中声明,复合键(涉及多个列)不能.但两者都是表级约束!


约束有四个逻辑级别:

1)列级:

CHECK ( ProductID > 0 )
Run Code Online (Sandbox Code Playgroud)

2)行级:

CHECK ( Product_start_date < Product_end_date )
Run Code Online (Sandbox Code Playgroud)

3)表级别(SQL Server中尚不支持以下示例):

CHECK ( NOT EXISTS ( SELECT *
                       FROM ( SELECT ROW_NUMBER() OVER ( PARTITION BY ProductID ) AS Tally
                                FROM Products AS P ) AS DT1 
                      WHERE Tally > 1 ) )
Run Code Online (Sandbox Code Playgroud)

4)数据库级别(SQL Server中尚不支持):

CREATE ASSERTION EnterpriseUniqueIds
   CHECK ( NOT EXISTS ( SELECT *
                          FROM ProductID AS P
                               JOIN Components AS C
                                  ON C.ComponentID = P.ProductID ) );
Run Code Online (Sandbox Code Playgroud)

关键约束涉及比较同一表中的不同行,因此它是表级约束.