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

时间:2012-02-29 05:42:05

标签: sql sql-server

一个。列级

GO

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

GO

湾表级

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

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

4 个答案:

答案 0 :(得分:12)

没有。如何应用约束只是个人品味的问题。

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

在另一种情况下,它不是“在列级别”或“表级别” - 它始终是相同的。

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

(CREATE TABLE statement)
GO

ALTER TABLE dbo.Products
ADD CONSTRAINT PK_Products_pid PRIMARY KEY(ProductID)

再次与您已有的其他两个选项相同。

答案 1 :(得分:7)

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


有四种逻辑级别的约束:

1)栏目级别:

CHECK ( ProductID > 0 )

2)行级别:

CHECK ( Product_start_date < Product_end_date )

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 ) )

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

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

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

答案 2 :(得分:1)

答案 3 :(得分:0)

有两种方法可以定义约束,一种是在列级别,另一种是在表级别。可以使用这些方法中的任何一种来应用约束。