2012-02-29 65 views
7

a. Cột CấpMức cột so với mức ràng buộc mức bảng trong máy chủ sql?

GO 

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

GO 

b. Bảng Cấp

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

Sự khác biệt của chúng giữa giới hạn mức cột và mức bảng có khác biệt gì không?

Trả lời

10

Không. Chỉ là vấn đề cá nhân về cách bạn áp dụng ràng buộc.

Ràng buộc khóa chính chỉ là ràng buộc khóa chính - nó luôn áp dụng cho bảng (sau cùng: nó có thể chứa nhiều cột - không thể "ở cấp cột").

Nó không phải "ở cấp cột" một lần hoặc ở "cấp độ bảng" trong trường hợp khác - nó luôn giống nhau.

Just for fun - bạn cũng có thể tạo ra các ràng buộc khoá chính một cách thứ ba:

(CREATE TABLE statement) 
GO 

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

và một lần nữa sẽ giống với hai lựa chọn khác mà bạn đã có.

+1

Cảm ơn marc, đã hiểu. –

6

Ví dụ đầu tiên của bạn tuyên bố ràng buộc trong dòng, số thứ hai thì không. Chỉ các phím đơn giản (liên quan đến một thuộc tính) mới có thể được khai báo trong dòng, hợp chất khóa (liên quan đến nhiều cột) không thể. Nhưng cả hai đều là mức bảng ràng buộc!


Có bốn mức logic của chế:

1) mức độ cột:

CHECK (ProductID > 0) 

2) mức Row:

CHECK (Product_start_date < Product_end_date) 

3) mức Table (sau đây ví dụ chưa được hỗ trợ trong 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) mức cơ sở dữ liệu (chưa được hỗ trợ trong SQL Server):

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

Một hạn chế quan trọng liên quan đến việc so sánh hàng khác nhau trong cùng một bảng, do đó nó là một hạn chế bảng cấp.

+0

Ít nhất là vào năm 2016, nó được hỗ trợ một phần thông qua [chức năng] (https://technet.microsoft.com/en-us/library/ms188258). –

+1

@PavelVoronin: sử dụng chức năng theo cách này đã được [vấn đề lịch sử] (https://web.archive.org/web/20100507204302/http://consultingblogs.emc.com/davidportas/archive/2007/02/19 /Trouble-with-CHECK-Constraints.aspx). Họ đã sửa nó vào năm 2016 chưa? – onedaywhen

+0

Không có cơ hội để kiểm tra kịch bản này, nhưng tôi đã cố gắng của tôi trên máy chủ năm 2014. Đến năm 2016, tôi có nghĩa là một năm =) –

0

Có hai cách để xác định ràng buộc mà người đang ở mức cột và thứ hai là tại bảng level.one có thể sử dụng bất kỳ các phương pháp này để áp dụng các ràng buộc.