三、约束
  SQLServer2008提供的强制数据完整性的机制:
  ①PRIMARYKEY约束
  ②FOREIGNKEY约束
  ③UNIQUE约束
  ④CHECK约束
  ⑤NOTNULL(非空性)
  ⑥IDENTITY约束
  使用约束优先于使用触发器、规则和默认值
  查询优化器使用约束定义生成高性能的查询执行计划
  ①PRIMARYKEY约束:
  可以在下面情况下使用:
  (1)作为表定义的一部分在创建表时创建。
  (2)添加到尚没有PRIMARYKEY约束的表中(一个表只能有一个PRIMARYKEY约束)。
  (3)如果已有PRIMARYKEY约束,则可对其进行修改或删除。
  特点:
  (1)每个表都应有一个主键,主键值。
  (2)主键内的任何列不能为空(null)。
  (3)要使用TRansact-SQL修改PRIMARYKEY,必须先删除现有的PRIMARYKEY约束,然后再重新创建。
  (4)创建表时指定主键,sqlserver会自动创建一个名为“PK_”且后跟表名的主键索引。如果不指定索引类型,则默认为聚集索引。该索引只能在删除与它保持联系的表或主键约束时才能删除。
  ②FOREIGNKEY约束
  标识表之间的关系,用于强制参照完整性,为表中一列或多列提供参照完整性。FOREIGNKEY约束也可以参照自身表中的其他列(例如:学生表中的“班长学号”列参照“学号”列),这种参照称为自参照。
  FOREIGNKEY约束可以在下面情况下使用:
  (1)作为表定义的一部分在创建表时创建。
  (2)如果现有表的某列与另一个表已有的PRIMARYKEY约束或UNIQUE约束相关联,则可向现有表添加FOREIGNKEY约束。
  (3)对已有的FOREIGNKEY约束进行修改或删除。
  使用FOREIGNKEY约束,应注意的几个问题:
  (1)每个表多可以有253个FOREIGNKEY约束。
  (2)FOREIGNKEY约束只能参照同一个数据库中的表,而不能参照其他数据库中的表。
  (3)FOREIGNKEY子句中的列数目和每个列指定的数据类型必须和REFERENCES子句中的列相同。
  (4)FOREIGNKEY约束不能自动创建索引。
  (5)在临时表中,不能使用FOREIGNKEY约束。
  (6)如果一个外键没有对应的主键值,则不能插入带该值的行。
  ③UNIQUE约束
  (1)UNIQUE约束在列集内强制执行值的性。
  (2)对于UNIQUE约束中的列,表中不允许有两行包含相同的非空值。
  (3)SQLServer创建了UNIQUE约束后会自动创建UNIQUE索引来强制UNIQUE约束的性要求。
  (4)如果插入重复行,SQLServer将返回错误信息。
  (5)向表中的现有列添加UNIQUE约束时,默认情况下SQLServer2008检查列中的现有数据确保除NULL外的所有值均。
  (6)UNIQUE约束与主键约束的区别:主键也强制执行性,但主键不允许空值,而且每个表中主键只能有一个,但UNIQUE列可以有多个,可以取空值。
  (7)UNIQUE约束优先于索引。
  ④CHECK约束
  (1)CHECK约束通过限制用户输入的值来加强域完整性。
  (2)它指定应用于列中输入的所有值的布尔(取值为TRUE或FALSE)搜索条件,拒绝所有不取值为TRUE的值。
  (3)可以为每列指定多个CHECK约束。
  ⑤IDENTITY约束
  自动编号约束又称作标识列,采用数字编号的方式依次增加一个增量。是为那些数字顺序递增的列准备的约束,可以自动完成数值添加。
  (1)标识种子
  (2)标识增量
  (3)标识列的数据类型
  四、完整性约束命名子句
  完整性约束命名子句的格式:
  CONSTRAINT<完整性约束条件名>[PRIMARYKEY短语|FOREIGNKEY短语|CHECK短语]
  例:建立学生登记表Student2,要求学号在10000至99999之间,姓名不能取空值,年龄小于30,性别‘男’或‘女’:
  1CREATETABLEStudent2(
  2snointCONSTRAINTC1CHECK(snoBETWEEN10000AND99999),
  3snameCHAR(8)CONSTRAINTC2NOTNULL,
  4sageintCONSTRAINTC3CHECK(sage<30),
  5ssexVARCHAR(2)CONSTRAINTC4CHECK(ssexIN('男','女')),
  6CONSTRAINTSKPRIMARYKEY(Sno)
  7);