2012-02-29 22 views
7

a。列レベルSQL Serverの列レベルとテーブルレベルの制約は何ですか?

GO 

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

GO 

b。テーブルレベル

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

カラムレベルとテーブルレベルの制約の違いは何ですか?

答えて

10

いいえ。制約を適用する方法は、個人的な好みの問題です。

主キー制約はちょうど主キー制約である - それは常に(結局: - それは、「列レベルで」することはできません、それは複数の列を含めることができます)テーブルに適用されます。

これは、「カラムレベル」では1回でも、それ以外の場合でも「テーブルレベル」ではなく、常に同じです。ちょうど楽しみのため

- あなたはまた、主キー制約に第三の方法で作成できます

(CREATE TABLE statement) 
GO 

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

をし、それが再びあなたが既に持っている他の二つのオプションと同じになります。

+1

marcさん、ありがとうございます。 –

6

最初の例では、の制約が宣言されています。 単純なキー(1つの属性を含む)は、の化合物キー(複数の列を含む)で宣言することはできません。しかし、どちらもテーブルレベルの制約です!

1)列レベル:

CHECK (ProductID > 0) 

2)行レベル:

CHECK (Product_start_date < Product_end_date) 

3)テーブルのレベル(以下


制約の4つの論理レベルがあります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)); 

キー制約は、同じテーブル内の異なる行を比較することを含むので、テーブル・レベルの制約です。

+0

少なくとも2016年には[functions](https://technet.microsoft.com/en-us/library/ms188258)で多少サポートされています。 –

+1

@PavelVoronin:この方法で関数を使用することは、[歴史的に問題がある](https://web.archive.org/web/20100507204302/http://consultingblogs.emc.com/davidportas/archive/2007/02/19) /トラブル--with-CHECK-Constraints.aspx)。彼らは2016年にそれを修正しましたか? – onedaywhen

+0

このシナリオをチェックする機会はありませんでしたが、私は2014年のサーバーを試しました。 2016年までには1年=)を意味します。 –

0

のために1は、列レベルである制約を定義するには、2つの方法があり、もう一方は、テーブルlevel.oneであるこれらのいずれかの方法を使用することができます制約を適用する。