當你為一個表定義約束時,給約束命名是一個好習慣。另外,SQL Server會為約束創建系統自動生成的名稱。當在沒有給約束命名的情況下,生成數據定義語言(DDL)(當DDL應用在幾個數據庫上時),那麼系統生產約束名一般是不一樣的。
在為數據庫生成計劃後,再生成詳細的約束列表,與一個詳細計劃構造的合法約束列表進行對比,是一個很好的習慣。當數據庫相當大時,這樣做是非常有益的。
下面的腳本演示了命名約束、不命名約束及系統自動生成的約束名之間的區別,三者使用了同樣的表,只不過每次都是重新創建的:
CREATE TABLE Parent
(pkey1 INT NOT NULL
CONSTRAINT pk_Parent PRIMARY KEY (pkey1))
GO
CREATE TABLE ConstraintName
(Pkey INT NOT NULL
CONSTRAINT pk_CnstNm primary key,
Parent_pkey1 INT NOT NULL,
col1 INT NULL
CONSTRAINT ck_CnstNm_col1 CHECK (col1 IN ( 'a','b' ) )
CONSTRAINT df_CnstNm_col1 DEFAULT 1,
CONSTRAINT fk_Parent_CnstNm FOREIGN KEY (Parent_pkey1)
REFERENCES Parent (pkey1)
)
GO
exec sp_helpconstraint ConstraintName
GO
DROP TABLE ConstraintName
GO
CREATE TABLE ConstraintName
(Pkey INT NOT NULL
primary key,
Parent_pkey1 INT NOT NULL
FOREIGN KEY (Parent_pkey1) REFERENCES PARENT(pkey1),
col1 INT NULL
CHECK (col1 IN ( 'a','b' ) )
DEFAULT 1
)
GO
exec sp_helpconstraint ConstraintName
GO
DROP TABLE ConstraintName
GO
CREATE TABLE ConstraintName
(Pkey INT NOT NULL
primary key,
Parent_pkey1 INT NOT NULL
FOREIGN KEY (Parent_pkey1) REFERENCES PARENT(pkey1),
col1 INT NULL
CHECK (col1 IN ( 'a','b' ) )
DEFAULT 1
)
GO
exec sp_helpconstraint ConstraintName
GO
DROP TABLE ConstraintName
GO
DROP TABLE Parent
GO