您的位置:首页 > 数据库

SQL 数据完整性 基础知识

2009-03-17 23:18 375 查看

数据完整性 基础知识

实体完整性

实体完整性将行定义为特定表的唯一实体。实体完整性通过索引、UNIQUE 约束、PRIMARY KEY 约束或 IDENTITY 属性强制表的标识符列或主键的完整性。

域完整性

域完整性指特定列的项的有效性。您可以强制域完整性限制类型(通过使用数据类型)、限制格式(通过使用 CHECK 约束和规则)或限制可能值的范围(通过使用 FOREIGN KEY 约束、CHECK 约束、DEFAULT 定义、NOT NULL 定义和规则)。

引用完整性

在输入或删除记录时,引用完整性保持表之间已定义的关系。在 SQL Server 2005 中,引用完整性通过 FOREIGN KEY 和 CHECK 约束,以外键与主键之间或外键与唯一键之间的关系为基础。引用完整性确保键值在所有表中一致。这类一致性要求不引用不存在的值,如果一个键值发生更改,则整个数据库中,对该键值的所有引用要进行一致的更改。
强制引用完整性时,SQL Server 将防止用户执行下列操作:
<!--[if !supportLists]-->・ <!--[endif]-->在主表中没有关联的记录时,将记录添加或更改到相关表中。
<!--[if !supportLists]-->・ <!--[endif]-->更改主表中的值,这会导致相关表中生成孤立记录。
<!--[if !supportLists]-->・ <!--[endif]-->从主表中删除记录,但仍存在与该记录匹配的相关记录。

用户定义完整性

用户定义完整性使您可以定义不属于其他任何完整性类别的特定业务规则。所有完整性类别都支持用户定义完整性。这包括 CREATE TABLE 中所有列级约束和表级约束、存储过程以及触发器。

数据约束

SQL Server 2005 提供了下列机制来强制列中数据的完整性:

PRIMARY KEY 约束

表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。在创建或修改表时,您可以通过定义 PRIMARY KEY 约束来创建主键。
一个表只能有一个 PRIMARY KEY 约束,并且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束可保证数据的唯一性,因此经常对标识列定义这种约束
创建:
ALTER TABLE TableName ADD CONSTRAINT TableName _pk PRIMARY KEY (Id)
删除:
ALTER TABLE TableName DROP CONSTRAINT TableName _pk

FOREIGN KEY 约束

外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。当创建或修改表时可通过定义 FOREIGN KEY 约束来创建外键。
在外键引用中,当一个表的列被引用作为另一个表的主键值的列时,就在两表之间创建了链接。这个列就成为第二个表的外键。
FOREIGN KEY 约束并不仅仅可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。FOREIGN KEY 约束可以包含空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过组成 FOREIGN KEY 约束的所有值的验证。若要确保验证了组合 FOREIGN KEY 约束的所有值,请将所有参与列指定为 NOT NULL。
创建:
[align=left]ALTER TABLE TableName [/align]
[align=left]ADD CONSTRAINT TableName _fk1[/align]
[align=left]FOREIGN KEY (FKId)[/align]
[align=left]REFERENCES PrimarKeyTable (Id)[/align]
删除:
[align=left]ALTER TABLE TableName [/align]
DROP CONSTRAINT TableName _fk1

UNIQUE 约束

可以使用 UNIQUE 约束确保在非主键列中不输入重复的值。尽管 UNIQUE 约束和 PRIMARY KEY 约束都强制唯一性,但想要强制一列或多列组合(不是主键)的唯一性时应使用 UNIQUE 约束而不是 PRIMARY KEY 约束。
可以对一个表定义多个 UNIQUE 约束,但只能定义一个 PRIMARY KEY 约束。
而且,UNIQUE 约束允许 NULL 值,这一点与 PRIMARY KEY 约束不同。不过,当与参与 UNIQUE 约束的任何值一起使用时,每列只允许一个空值。
FOREIGN KEY 约束可以引用 UNIQUE 约束。
创建:
ALTER TABLE TablenName ADD CONSTRAINT ConstraintName UNIQUE (Column2,Column3)
删除:
ALTER TABLE TablenName DROP CONSTRAINT ConstraintName

CHECK 约束

通过限制列可接受的值,CHECK 约束可以强制域的完整性。此类约束类似于 FOREIGN KEY 约束,因为可以控制放入列中的值。但是,它们在确定有效值的方式上有所不同:FOREIGN KEY 约束从其他表获得有效值列表,而 CHECK 约束通过不基于其他列中的数据的逻辑表达式确定有效值。例如,可以通过创建 CHECK 约束将 salary 列中值的范围限制为从 $15,000 到 $100,000 之间的数据。这将防止输入的薪金值超出正常的薪金范围。
CHECK 约束不接受计算结果为 FALSE 的值。因为空值的计算结果为 UNKNOWN,所以表达式中存在这些值可能会覆盖约束。例如,假设对 int 列 MyColumn 应用一个约束,指定 MyColumn 只能包含值 10(即 MyColumn = 10)。如果将值 NULL 插入到 MyColumn,SQL Server 2005 Database Engine 将插入 NULL 且不返回错误。
如果 CHECK 约束检查的条件对于表中的任何行都不是 FALSE,它将返回 TRUE。如果刚创建的表没有任何行,则此表的任何 CHECK 约束都视为有效。这种情况可能会产生意外结果,如下面的示例所示。
创建:
ALTER TABLE TablenName ADD CONSTRAINT ConstraintName CHECK (Column2>Column3)
删除:
ALTER TABLE TablenName DROP CONSTRAINT ConstraintName

DEFAULT 定义

记录中的每列均必须有值,即使该值是 NULL。可能会有这种情况:必须向表中加载一行数据但不知道某一列的值,或该值尚不存在。如果列允许空值,就可以为行加载空值。由于可能不希望有可为空的列,因此最好是为列定义 DEFAULT 定义(如果合适)。例如,通常为数值列指定零作为默认值,为字符串列指定 N/A 作为默认值。
将某行加载到某列具有 DEFAULT 定义的表中时,即隐式指示 SQL Server 2005 Database Engine 将默认值插入到没有指定值的列中
创建:
ALTER TABLE doc_exz ADD CONSTRAINT col_b_def DEFAULT 50 FOR column_b
删除:
ALTER TABLE doc_exz DROP CONSTRAINT col_b_def

允许空值

列的为空性决定表中的行是否可为该列包含空值。空值(或 NULL)不同于零 (0)、空白或长度为零的字符串(如 "")。NULL 的意思是没有输入。出现 NULL 通常表示值未知或未定义。
设置为非空:alter table MyTable modify Column2 varchar(20) not null;
设置为空:alter table MyTable modify Column2 varchar(20) null;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: