第3章 字段的属性和约束
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章 字段的属性和约束
除了第2章讲的字段的数据类型 之外,字段的域还包括属性和束。 3.1 字段的属性 3.2 约 束
3.1 字段的属性
字段除了前面已讨论的属性如:名称、数据 类型、为空性和数据长度之外,还具有默认值、 精度、小数位数,描述等属性。 3.1.1 默认值 3.1.2 精度和小数位数 3.1.3 标识、标识种子和标识递增量 3.1.4 ROWGUIDCOL 3.1.5 空 (NULL) 值
一个表只能有一列定义为 IDENTITY 属性,而且该列必须以 decimal、 int、numeric、smallint、bigint 或 tinyint 数据类型定义。 可指定种子和增量值。二者的默认值均为 1。 标识符列不允许空值,也不能包含 DEFAULT 定义或对象。
3.1.4 ROWGUIDCOL
3.2.4 字段 列)约束和表约束 字段(列 约束和表约束
约束可以是字段(列)约束或表约束。 字段(列)约束被指定为字段(列)定义的一部分,并且仅适用于那个字 段(列)(前面的示例中的约束就是字段(列)约束)。 表约束的声明与列的定义无关,可以适用于表中一个以上的列。 当一个约束中必须包含一个以上的列时,必须使用表约束。 例如,如果一个表的主键内有两个或两个以上的列,则必须使用表约 束将这两列加入主键内。假设有一个表记录了工厂内的一台计算机上所发 生的事件。假定有几类事件可以同时发生,但不能有两个同时发生的事件 属于同一类型。这一点可以通过将 type 列和 time 列加入双列主键内来强 制执行。 DEFAULT(默认)约束和NULL(空)约束在第3.1节已经讲过了, FOREIGN KEY(外键) 约束将在第5章讨论。
3.1.5 空 (NULL) 值
空值通常表示未知、不可用或将在以后添加的数据。空值或 NULL 并不等于零 (0)、空白或零长度的字符串(如""),NULL 意味 着没有输入。NULL 的存在通常表明值未知或未定义。例如, pubs 数据库 titles 表中 price 列的空值并不表示该书没有价格,而 是指其价格未知或尚未设定。 没有两个相等的空值。比较两个空值或将空值与任何其它数 值相比较均返回未知,这是因为每个空值均为未知。 如果插入某行但没有为允许空值的列包括值,则 SQL Server 为该列提供 NULL 值(除非存在 DEFAULT 定义或 DEFAULT 对 象)。用关键字 NULL 定义的列也接受用户的 NULL 显式输入,不 论它是何种数据类型或是否有默认值与之关联。NULL 值不应放在 引号内,否则会被解释为字符串NULL而不是空值。 指定一列不允许空值而确保行中一列永远包含数据可以保持 数据的完整性。因为如果不允许空值,则用户在向表中写数据时 必须在列中输入一个值,否则该行不会被接收到数据库。
3.1.1 默认值
记录中的每一字段均必须有值,即使它是 NULL。可能会有这 种情况,当向表中装载新行时可能不知道某一字段的值,或该值 尚不存在。如果该字段的值允许空值,就可以将该字段赋予空值。 由于有时不希望有可为空的字段值,因此如果合适,更好的解决 办法可能是为该字段设置默认值。例如,通常将数字型的字段的 默认值指定为零,将字符串字段的默认值指定为暂缺。 由于在添加记录过程中,未输入某字段值时,可以使用字段默 认值把一个值自动加入到表字段中,因此也可以为字段中出现频 率最高的值定义默认值(即DEFAULT),这样新行被加入到该表中 时,用户就不必输入定义为DEFAULT字段的值了。例如,如果大 部分供应商都在北京,则可以为“供应商”表的“城市”字段设 置一个默认值“北京”。添加新记录时可以接受该默认值,也可 以键入新值覆盖它。 1. 在创建表时创建列的 DEFAULT 定义 2. 在现有表中创建列的 DEFAULT 定义 3. 将已有的列定义为DEFAULT 4. 创建 DEFAULT 对象
3.2.1 3.2.2 3.2.3 3.2.4
Leabharlann Baidu
PRIMARY KEY 约束 UNIQUE约束 CHECK约束 字段(列)约束和表约束
3.2.1 PRIMARY KEY 约束
表中经常有一个列或列的组合,其值能惟一地标识表中的 每一行。这样的一列或多列称为表的主键,通过它可强制表的 实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约 束来创建主键。 一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保 惟一数据,所以经常用来定义标识列。 1. 在创建表时创建 PRIMARY KEY 约束 2. 在现有表中添加 PRIMARY KEY 约束 3. 为已有的列定义PRIMARY KEY 约束 4. 删除约束
尽管 IDENTITY 属性自动为表生成行号,但不同表的标识符列可 以生成相同的行号。这是因为 IDENTITY 属性只须在所使用的表上保 持惟一即可。如果应用程序需要生成在整个数据库或世界各地所有网 络计算机的全部数据库中均为惟一的标识符列,应使用 ROWGUIDCOL 属性、uniqueidentifier 数据类型和 NEWID 函数。 可在每个表上创建一个全局惟一的标识符列。当必须对来自多个 数据库系统的相似数据进行合并时(例如,在包含位于世界各地分公司 的数据的客户帐单系统中),包含全局惟一值的列很有用。当数据汇集 到客户中心进行合并和制作报表时,使用全局惟一值可防止不同国家/ 地区的客户拥有相同的帐单号或客户 ID。 使用 ROWGUIDCOL 属性定义全局惟一标识符列时应注意; (1) 一个表只能有一个 ROWGUIDCOL 列,且该列必须定义为 uniqueidentifier 数据类型。 (2) SQL Server 不为该列自动生成值。若要插入全局惟一数值, 应为列创建 DEFAULT 定义,以使用 NEWID 功能生成全局惟一数值。
3.2.2 UNIQUE约束 约束
可使用UNIQUE 约束确保在非主键列中不输入重复值。尽管 UNIQUE 约束和 PRIMARY KEY约束都强制惟一性,但在强制下例中 的惟一性时应使用 UNIQUE 约束而不是 PRIMARY KEY 约束。 UNIQUE约束可用于以下列 (1)非主键的一列或列组合。 注意:一个表可以定义多个UNIQUE约束,而只能定义一个 PRIMARY KEY约束。 (2)允许空值的列。允许空值的列上可以定义 UNIQUE 约束,而 不能定义 PRIMARY KEY 约束。 1. 在创建表时创建 UNIQUE 约束 2. 在现有表中添加UNIQUE约束 3. 为已有的列定义UNIQUE 约束 4. 删除约束
3.1.2 精度和小数位数
精度显示该列值的最大数字个数。小数位数显示该列值小数 点右边能出现的最大数字个数。 数值列的精度是指选定数据类型所使用的最大位数。非数值 列的精度指最大列宽或定义的列宽。除 decimal 和 numeric 外, 其它数据类型的精度自动定义。如果要重新定义数值列的最大位 数,可以更改 decimal 和 numeric 数据类型的精度。不允许更改 不是这两种指定数据类型的列的精度。 numeric 或 decimal 列的小数位数是指该列值小数点右边能 出现的最大数字个数。在选定数据类型时,列的小数位数默认设 置为 0。对于包含近似浮点数的列,由于小数点右边的位数不固定, 故其小数位数并未定义。如果要重新定义小数点右边的位数,可 以更改 numeric 或 decimal 列的小数位数。
3.2.3 CHECK约束 约束
CHECK 约束通过限制输入到列中的值来强制域的完整性。这与 FOREIGN KEY 约束控制列中的数值相似。区别在于它们如何判断哪 些值有效:FOREIGN KEY 约束从另一个表中获得有效数值列表, CHECK 约束从逻辑表达式判断而非基于其它列的数据。 可以通过任何基于逻辑运算符返回结果 TRUE 或 FALSE 的逻辑 (布尔)表达式来创建 CHECK 约束。 对单独一列可使用多个 CHECK 约束,并按约束创建的顺序对其 取值。通过在表一级上创建 CHECK 约束,可以将该约束应用到多列 上。 1. 在创建表时创建 CHECK 约束 2. 在现有表中添加CHECK UNIQUE约束 3. 为已有的列定义CHECK 约束 4. 删除约束
3.1.3 标识、标识种子和标识递增量 标识、
标识符列可实现自动编号。对任何表都可创建包含系统所生成序号值的 一个标识符列,该序号值惟一标识表中的一行。例如,当在客户表中插入行 时,标识符列可自动为应用程序产生惟一的客户ID值。标识符列在其所定义 的表中包含的数值通常是惟一的。这意味着在包含标识符列的其它表中可使 用与之相同的数值进行标识。 标识符列可用 IDENTITY 属性建立。 标识种子(Identity Seed)显示标识列的种子值。 标识递增量(Identity Increment)显示标识列的递增量值。 每个表中只能创建一个标识符列。 创建标识符列使应用程序开发人员得以对表中所插入的第一行指定标识 数字(Identity Seed 属性),并确定要添加到种子上的增量(Identity Increment 属性)以决定后面的标识数字。在向具有标识符列的表中插入值时,SQL Server 2000通过递增种子值的方法自动生成下一个标识值。 在用 IDENTITY 属性定义标识符列时应注意以下几点:
3.2 约
束
约束是自动强制数据库完整性的方式。它通过定义列中允许 值的规则,来维护数据的完整性。在SQL Server 2000 中常用的 约束有:
PRIMARY KEY(主键)约束 UNIQUE(惟一)约束 CHECK(检查)约束 DEFAULT(默认)约束 NOT NULL(非空)约束 FOREIGN KEY(外键)约束
除了第2章讲的字段的数据类型 之外,字段的域还包括属性和束。 3.1 字段的属性 3.2 约 束
3.1 字段的属性
字段除了前面已讨论的属性如:名称、数据 类型、为空性和数据长度之外,还具有默认值、 精度、小数位数,描述等属性。 3.1.1 默认值 3.1.2 精度和小数位数 3.1.3 标识、标识种子和标识递增量 3.1.4 ROWGUIDCOL 3.1.5 空 (NULL) 值
一个表只能有一列定义为 IDENTITY 属性,而且该列必须以 decimal、 int、numeric、smallint、bigint 或 tinyint 数据类型定义。 可指定种子和增量值。二者的默认值均为 1。 标识符列不允许空值,也不能包含 DEFAULT 定义或对象。
3.1.4 ROWGUIDCOL
3.2.4 字段 列)约束和表约束 字段(列 约束和表约束
约束可以是字段(列)约束或表约束。 字段(列)约束被指定为字段(列)定义的一部分,并且仅适用于那个字 段(列)(前面的示例中的约束就是字段(列)约束)。 表约束的声明与列的定义无关,可以适用于表中一个以上的列。 当一个约束中必须包含一个以上的列时,必须使用表约束。 例如,如果一个表的主键内有两个或两个以上的列,则必须使用表约 束将这两列加入主键内。假设有一个表记录了工厂内的一台计算机上所发 生的事件。假定有几类事件可以同时发生,但不能有两个同时发生的事件 属于同一类型。这一点可以通过将 type 列和 time 列加入双列主键内来强 制执行。 DEFAULT(默认)约束和NULL(空)约束在第3.1节已经讲过了, FOREIGN KEY(外键) 约束将在第5章讨论。
3.1.5 空 (NULL) 值
空值通常表示未知、不可用或将在以后添加的数据。空值或 NULL 并不等于零 (0)、空白或零长度的字符串(如""),NULL 意味 着没有输入。NULL 的存在通常表明值未知或未定义。例如, pubs 数据库 titles 表中 price 列的空值并不表示该书没有价格,而 是指其价格未知或尚未设定。 没有两个相等的空值。比较两个空值或将空值与任何其它数 值相比较均返回未知,这是因为每个空值均为未知。 如果插入某行但没有为允许空值的列包括值,则 SQL Server 为该列提供 NULL 值(除非存在 DEFAULT 定义或 DEFAULT 对 象)。用关键字 NULL 定义的列也接受用户的 NULL 显式输入,不 论它是何种数据类型或是否有默认值与之关联。NULL 值不应放在 引号内,否则会被解释为字符串NULL而不是空值。 指定一列不允许空值而确保行中一列永远包含数据可以保持 数据的完整性。因为如果不允许空值,则用户在向表中写数据时 必须在列中输入一个值,否则该行不会被接收到数据库。
3.1.1 默认值
记录中的每一字段均必须有值,即使它是 NULL。可能会有这 种情况,当向表中装载新行时可能不知道某一字段的值,或该值 尚不存在。如果该字段的值允许空值,就可以将该字段赋予空值。 由于有时不希望有可为空的字段值,因此如果合适,更好的解决 办法可能是为该字段设置默认值。例如,通常将数字型的字段的 默认值指定为零,将字符串字段的默认值指定为暂缺。 由于在添加记录过程中,未输入某字段值时,可以使用字段默 认值把一个值自动加入到表字段中,因此也可以为字段中出现频 率最高的值定义默认值(即DEFAULT),这样新行被加入到该表中 时,用户就不必输入定义为DEFAULT字段的值了。例如,如果大 部分供应商都在北京,则可以为“供应商”表的“城市”字段设 置一个默认值“北京”。添加新记录时可以接受该默认值,也可 以键入新值覆盖它。 1. 在创建表时创建列的 DEFAULT 定义 2. 在现有表中创建列的 DEFAULT 定义 3. 将已有的列定义为DEFAULT 4. 创建 DEFAULT 对象
3.2.1 3.2.2 3.2.3 3.2.4
Leabharlann Baidu
PRIMARY KEY 约束 UNIQUE约束 CHECK约束 字段(列)约束和表约束
3.2.1 PRIMARY KEY 约束
表中经常有一个列或列的组合,其值能惟一地标识表中的 每一行。这样的一列或多列称为表的主键,通过它可强制表的 实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约 束来创建主键。 一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保 惟一数据,所以经常用来定义标识列。 1. 在创建表时创建 PRIMARY KEY 约束 2. 在现有表中添加 PRIMARY KEY 约束 3. 为已有的列定义PRIMARY KEY 约束 4. 删除约束
尽管 IDENTITY 属性自动为表生成行号,但不同表的标识符列可 以生成相同的行号。这是因为 IDENTITY 属性只须在所使用的表上保 持惟一即可。如果应用程序需要生成在整个数据库或世界各地所有网 络计算机的全部数据库中均为惟一的标识符列,应使用 ROWGUIDCOL 属性、uniqueidentifier 数据类型和 NEWID 函数。 可在每个表上创建一个全局惟一的标识符列。当必须对来自多个 数据库系统的相似数据进行合并时(例如,在包含位于世界各地分公司 的数据的客户帐单系统中),包含全局惟一值的列很有用。当数据汇集 到客户中心进行合并和制作报表时,使用全局惟一值可防止不同国家/ 地区的客户拥有相同的帐单号或客户 ID。 使用 ROWGUIDCOL 属性定义全局惟一标识符列时应注意; (1) 一个表只能有一个 ROWGUIDCOL 列,且该列必须定义为 uniqueidentifier 数据类型。 (2) SQL Server 不为该列自动生成值。若要插入全局惟一数值, 应为列创建 DEFAULT 定义,以使用 NEWID 功能生成全局惟一数值。
3.2.2 UNIQUE约束 约束
可使用UNIQUE 约束确保在非主键列中不输入重复值。尽管 UNIQUE 约束和 PRIMARY KEY约束都强制惟一性,但在强制下例中 的惟一性时应使用 UNIQUE 约束而不是 PRIMARY KEY 约束。 UNIQUE约束可用于以下列 (1)非主键的一列或列组合。 注意:一个表可以定义多个UNIQUE约束,而只能定义一个 PRIMARY KEY约束。 (2)允许空值的列。允许空值的列上可以定义 UNIQUE 约束,而 不能定义 PRIMARY KEY 约束。 1. 在创建表时创建 UNIQUE 约束 2. 在现有表中添加UNIQUE约束 3. 为已有的列定义UNIQUE 约束 4. 删除约束
3.1.2 精度和小数位数
精度显示该列值的最大数字个数。小数位数显示该列值小数 点右边能出现的最大数字个数。 数值列的精度是指选定数据类型所使用的最大位数。非数值 列的精度指最大列宽或定义的列宽。除 decimal 和 numeric 外, 其它数据类型的精度自动定义。如果要重新定义数值列的最大位 数,可以更改 decimal 和 numeric 数据类型的精度。不允许更改 不是这两种指定数据类型的列的精度。 numeric 或 decimal 列的小数位数是指该列值小数点右边能 出现的最大数字个数。在选定数据类型时,列的小数位数默认设 置为 0。对于包含近似浮点数的列,由于小数点右边的位数不固定, 故其小数位数并未定义。如果要重新定义小数点右边的位数,可 以更改 numeric 或 decimal 列的小数位数。
3.2.3 CHECK约束 约束
CHECK 约束通过限制输入到列中的值来强制域的完整性。这与 FOREIGN KEY 约束控制列中的数值相似。区别在于它们如何判断哪 些值有效:FOREIGN KEY 约束从另一个表中获得有效数值列表, CHECK 约束从逻辑表达式判断而非基于其它列的数据。 可以通过任何基于逻辑运算符返回结果 TRUE 或 FALSE 的逻辑 (布尔)表达式来创建 CHECK 约束。 对单独一列可使用多个 CHECK 约束,并按约束创建的顺序对其 取值。通过在表一级上创建 CHECK 约束,可以将该约束应用到多列 上。 1. 在创建表时创建 CHECK 约束 2. 在现有表中添加CHECK UNIQUE约束 3. 为已有的列定义CHECK 约束 4. 删除约束
3.1.3 标识、标识种子和标识递增量 标识、
标识符列可实现自动编号。对任何表都可创建包含系统所生成序号值的 一个标识符列,该序号值惟一标识表中的一行。例如,当在客户表中插入行 时,标识符列可自动为应用程序产生惟一的客户ID值。标识符列在其所定义 的表中包含的数值通常是惟一的。这意味着在包含标识符列的其它表中可使 用与之相同的数值进行标识。 标识符列可用 IDENTITY 属性建立。 标识种子(Identity Seed)显示标识列的种子值。 标识递增量(Identity Increment)显示标识列的递增量值。 每个表中只能创建一个标识符列。 创建标识符列使应用程序开发人员得以对表中所插入的第一行指定标识 数字(Identity Seed 属性),并确定要添加到种子上的增量(Identity Increment 属性)以决定后面的标识数字。在向具有标识符列的表中插入值时,SQL Server 2000通过递增种子值的方法自动生成下一个标识值。 在用 IDENTITY 属性定义标识符列时应注意以下几点:
3.2 约
束
约束是自动强制数据库完整性的方式。它通过定义列中允许 值的规则,来维护数据的完整性。在SQL Server 2000 中常用的 约束有:
PRIMARY KEY(主键)约束 UNIQUE(惟一)约束 CHECK(检查)约束 DEFAULT(默认)约束 NOT NULL(非空)约束 FOREIGN KEY(外键)约束