一个.列级别
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)
而且这又与你已经拥有的其他两个选项相同.
您的第一个示例在行中声明约束,第二个示例没有.只有简单的键(涉及一个属性)可以在行中声明,复合键(涉及多个列)不能.但两者都是表级约束!
约束有四个逻辑级别:
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)
关键约束涉及比较同一表中的不同行,因此它是表级约束.