关于SQL的学习记录(十六、完整性控制)

完整性控制

了解完整性约束:

  • 数据的完整性
    数据完整性的提出,其实是为了防止数据库中存在非法数据,或者防止用户向数据表输入非法数据等。这里所说的非法数据指的是不符合实际情况和规定的数据,例如,在年龄字段中输入的3000,在score表中输入student表中并不存在的学号等等。
    数据完整性被分为4大类,分别是实体完整性(Entity Integrity)域完整性(Domain Integrity)参照完整性(Referential Integrity和==用户自定义完整性(User-definedIntegrity)==等。下面对其进行简要介绍。
    • 实体完整性(Entity Integrity)
      这类完整性用于防止数据表中有重复的记录存在。在数据表中通过设置主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束和惟一(UNIQUE)约束,使得表中每一行记录都能表示惟一的一个实体对象。
    • 完整性(Domain Integrity)
      这类完整性用于防止用户向数据表的具体字段输入非法数值,或不向必填字段输入数据等等。要使得满足域完整性,则可以使用校验约束(CHECK)、非空约束(NOT NULL)或外键(FOREIGN KEY)约束等几个约束实现。
    • 参照完整性(Referential lntegrity)
      这类完整性防止多个相关表之间的数据不一致。例如,在score表中存在“张三”各科成绩的情况下,设置参照完整性可以防止将student表中“张三”的记录删除。甚至还可以解决,在student表中更改“张三”这条记录的主键“学号”的值时,数据库系统自动更新score表中所有“张三”成绩记录的“学号”值。这样就很好的维护了多个相关表之间的数据一致性。参照完整性可以通过设置主键(PRIMARY KEY)约束和外键(FOREIGN KEY)约束实现。
    • 用户自定义完整性(User-defined Integrity)
      有时,使用数据库系统提供的完整性约束并不能解决用户的需求。所以,有些数据库管理系统为用户提供了自定义完整性的功能。
  • 完整性约束的类型
    数据库的完整性要通过设置约束来解决。因此,理解约束和使用约束就变得尤为重要。数据库的完整性约束有三种基本类型,分别是与表相关约束域约束断言
    • 与表相关的约束是在表中定义的一种约束,其应用是最多的,并且有多种约束选项,如非空(NOT NUL)约束、主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束、校验(CHECK)约束、惟一(UNIQUE)约束等。在定义字段时可以定义与表相关的约束,此时称其为字段约束。在定义表时确定的与表相关的约束被称为表约束。
    • 域约束是在域定义中确定的一种约束,它与域中定义的所有字段都有关系。域约束只能使用校验(CHECK)约束选项。
    • 断言是在定义断言时确定的约束,断言可以与一个或多个数据表关联。断言只能使用校验(CHECK)约束选项。
      在这里插入图片描述
      与表有关的约束:
  • 字段约束与表约束的创建
    • 字段约束是某字段的特定约束,被包含在字段的定义中,即书写在字段的定义之后用空格分隔开,而不必指定字段名。
      字段约束的语法格式为:<字段名><类型定义>[其他定义][约束类型]
    • 表约束与字段定义相互独立,不包含在字段定义中。表约束通常对多个字段一起进行约束,与字段定义用逗号分隔开。
      定义表约束时,必须指定所要约束的所有字段名。
      表约束的语法格式为:[CONSTRAINT 约束名]<约束类型>(字段名1,字段名2,....,字段名n)
  • 非空约束
    • 对于数据表中的字段可以设置非空(NOT NULL)约束,即把字段设置为必填字段。在默认情况下,表中所有字段都可以接收空值(NULL)。但给字段设置非空约束后,则字段不能再接收空值。
    • 只有字段约束支持非空(NOT NULL)约束,而表约束、域约束、断言不支持非空约束。
    • 定义非空约束的语法格式为:<字段名><类型定义>[其他定义][NOT NULL]
  • 唯一约束
    • 唯一约束用于表中的非主键字段,UNIQUE约束保证一个字段或者多字段的完整性,确保这些字段不会输入重复的值。定义了UNIQUE约束的字段称为唯一键,系统自动为唯一键创建唯一索引,从而确保唯一键的唯一性。
    • 唯一键的值可以是“NULL”值,但系统为了确保其唯一性,不允许出现多个“NULL"值而只允许出现一个“NULL”值。(MySQL允许多个空值)唯一约束可以用于字段约束,也可以用于表约束。
    • 唯一约束做为字段约束时,将其定义在字段后用空格隔开,其语法格式为:<字段名><类型定义>[其他定义][UNIQUE]
    • 当唯一约束做为表约束时,将其定义在所有字段之后进行并用逗号隔开,语法格式为:[CONSTRAINT 约束名] UNIQUE(字段名1,字段名2,...)
  • 主键约束
    在数据库表中,通常用一个字段或者几个字段的组合值,惟一的标识表中的记录。人们将这一字段或者字段的组合称为主键。通过设置主键(主键约束)可以防止表中有重复记录出现,即保证了实体完整性。
    • 主键约束与惟一约束很相似,但有下面的区别。
      ❀一个数据表中可以设置多个UNIQUE约束,但只能设置一个主键。
      ❀被设置为主键的字段值不能是NULL值,而被设置为UNIQUE约束的字段值允许是NULL值。
    • 定义主键约束(PRIMARY KEY)时,可以用于字段约束,也可以用于表约束,还可以通过ALTER TABLE语句定义。
    • 主键约束做为字段约束时,将其定义在字段后用空格隔开,其语法格式为:<字段名><类型定义>[其他定义][PRIMARY KEY]
    • 当主键约束做为表约束时,将其定义在所有字段之后进行并用逗号隔开,语法格式为:[CONSTRAINT 约束名] PRIMARY KEY(字段名1,字段名2,...)
  • 外键约束
    FOREIGN KEY约束定义A表中的数据与B表中数据的联系,为表中的一个字段或者多个字段的数据提供数据完整性参照。FOREIGN KEY约束通常是和PRIMARY KEY约束或者UNIQUE约束同时使用的。
    • FOREIGN KEY约束指定某一个字段或一组字段做为外部键,而包括外键的表称为子表,包括外键所引用的主键的表称为父表。子表在外键上的取值是父表中主键的值或是取空值,以此确保两个表的连接,保证实体的参照完整性。
    • 对于FOREIGN KEY约束需要注意以下几点:
      ❀一个表最多只能参照253个不同的数据表,每个表也最多只能有253个FOREIGN KEY约束。FOREIGN KEY约束不能应用于临时表。
      FOREIGN KEY字段对应的父表中的字段在父表中必须是主键或是有UNIQUE设置的字段。在实施FOREIGN KEY约束时,用户必须至少拥有被参照表中参照字段的SELECT或者REFERENCES权限。
      FOREIGN KEY约束同时也可以参照自身表中的其他字段。❀FOREIGN KEY字段上的取值可以是NULL值。
      FOREIGN KEY约束,只能参照本身数据库中的某个表,而不能参照其他数据库中的表。跨数据库的参照只能通过触发器来实现。
    • 外键约束可以用于定义字段约束,也可以用于表约束,还可以通过ALTER TABLE语句定义。
    • FOREIGN KEY约束做为字段约束时,将其定义在字段后用空格隔开,语法格式为:<字段名><类型定义>[其他定义] REFERENCES 父表名(父表中的主键字段名)
    • 当外键约束作为表约束时,应当将其定义在所有字段之后进行并用逗号隔开,其语法格式为:CONSTRAINT 约束名 FOREIGN KEY(字段名) REFERENCES 父表名(字段名)
    • 创建失败的话需要添加引擎ENGINE-InnoDB
  • 扩展外键约束的内容
    在输入或删除记录时,引用完整性保持表之间已定义的关系。引用完整性确保键值在所有表中一致。这样的一致性要求不能引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。
    • 在保持子表中的外键约束字段与父表中的主键约束(或惟一约束)字段的引用完整性,数据库管理系统要进行以下破坏引用完整性的检查:
      • 向子表插入记录时,数据库管理系统必须确保插入到子表中的每一条新记录的FOREIGN KEY约束字段值是父表的参考字段(有主键约束或惟一约束的字段)中有匹配的字段值,否则系统禁止进行插入语句。
      • 更改父表中的值并导致相关子表中的记录孤立。从父表中删除记录,但仍存在与该记录匹配的相关记录。如果要删除的父表的记录中,参考字段的值被子表的外键约束字段所引用,则数据库管理系统禁止进行删除记录操作。如果一定要进行删除,则必须先删除其子表中的引用记录,才能删除父表的记录。(更新同理,要先删除子表中的记录)
      • 在更新子表中FOREIGN KEY约束字段的值时,要注意子表中新的FOREIGNKEY值必须在父表的参考字段中有匹配的字段值,否则数据库管理系统禁止进行记录更新操作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值