日期:2014-05-18 浏览次数:20524 次
A. 使用 PRIMARY KEY 约束 下例显示在示例数据库 pubs 的 jobs 表中,job_id 列中具有聚集索引的 PRIMARY KEY 约束的列定义;此例由系统提供约束名。 job_id smallint PRIMARY KEY CLUSTERED 下例显示如何为 PRIMARY KEY 约束提供名称。此约束用于 employee 表中的 emp_id 列。此列基于用户定义数据类型。 emp_id empid CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED B. 使用 FOREIGN KEY 约束 FOREIGN KEY 约束用于引用其它表。FOREIGN KEY 可以是单列键或多列键。下例显示 employee 表上引用 jobs 表的单列 FOREIGN KEY 约束。对于单列 FOREIGN KEY 约束,只需要 REFERENCES 子句。 job_id smallint NOT NULL DEFAULT 1 REFERENCES jobs(job_id) 也可以显式使用 FOREIGN KEY 子句并复述列特性。注意在这两个表中列名不必相同。 FOREIGN KEY (job_id) REFERENCES jobs(job_id) 多列键约束作为表约束创建。在 pubs 数据库中,sales 表包含多列 PRIMARY KEY。下例显示如何从其它表中引用此键(可选择显式约束名)。 CONSTRAINT FK_sales_backorder FOREIGN KEY (stor_id, ord_num, title_id) REFERENCES sales (stor_id, ord_num, title_id) C. 使用 UNIQUE 约束 UNIQUE 约束用于强制非主键列的唯一性。PRIMARY KEY 约束列自动包含唯一性限制;但是,UNIQUE 约束允许存在空值。下例显示表 authors 中名为 pseudonym 的列。该列强制作者笔名必须唯一。 pseudonym varchar(30) NULL UNIQUE NONCLUSTERED 下例显示在 stor_id 实际上是 PRIMARY KEY 的 stores 表中,stor_name 列和 city 列上创建的 UNIQUE 约束;同一个城市中的商店不应同名。 CONSTRAINT U_store UNIQUE NONCLUSTERED (stor_name, city) D. 使用 DEFAULT 定义 使用 INSERT 和 UPDATE 语句时,如果没有提供值,则默认值会提供值。在 pubs 数据库中,使用了许多 DEFAULT 定义以确保输入有效的数据或占位符。 在 jobs 表上,当没有显式输入实际的描述信息时,默认的字符串将提供描述信息(列 job_desc)。 DEFAULT 'New Position - title not formalized yet' 在 employee 表中,员工可以受雇于子公司或母公司。如果没有显式提供公司信息,则输入母公司(注意在表定义中可以嵌套注释,如下所示)。 DEFAULT ('9952') /* By default the Parent Company Publisher is the company to whom each employee reports. */ 除了常量以外,DEFAULT 定义还可以包含函数。使用下例获取输入项的当前日期: DEFAULT (getdate()) niladic 函数也可以提高数据的完整性。若要跟踪插入行的用户,请使用 niladic 函数 USER(niladic 函数不使用括号): DEFAULT USER E. 使用 CHECK 约束 下例显示对输入到 jobs 表中的 min_lvl 列和 max_lvl 列的值的限制。这两个约束都未命名: CHECK (min_lvl >= 10) 与 CHECK (max_lvl <= 250) 下例显示对输入到 employee 表的 emp_id 列中的字符数据具有模式限制的命名约束。 CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' OR emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]') 下例指定 pub_id 必须在特定的列表中或遵循给定的模式。此约束用于 publishers 表中的 pub_id 列。 CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756') OR pub_id LIKE '99[0-9][0-9]') F. 完整的表定义 下例显示 pubs 数据库中所创建的三个表(jobs、employee 和 publishers)的完整表定义,其中包含所有的约束定义。 /* ************************** jobs table ************************** */ CREATE TABLE jobs ( job_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, job_desc varchar(50) NOT NULL DEFAULT 'New Position - title not formalized yet', min_lvl tinyint NOT NULL CHECK (min_lvl >= 10), max_lvl tinyint NOT NULL CHECK (max_lvl <= 250) ) /* ************************* employee table ************************* */ CREATE TABLE employee ( emp_id empid CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'), /* Each employee ID consists of three characters that represent the employee's initials, followed by a five digit number ranging from 10000 through 99999 and then the employee's gender (M or F). A (hyphen) - is acceptable for the middle initial. */ fname varchar(20) NOT NULL, minit char(1) NULL, lname v