当前位置: 首页 > 科技观察

关系型数据库的约束机制分析

时间:2023-03-13 23:56:28 科技观察

1.关系型数据库市场主流的关系型数据库:Oracle、DB2、Sybase、PostgreSQL、MicrosoftSQLServer、MicrosoftAccess、MySQL。关系型数据库具有三大完整性:实体完整性:实体属性中的标识属性不能为空或重复。这个约束是通过指定的主键实现的,它的约束是由系统强制执行的。参照完整性:实体中的外键可以为空,但不能为假。用户自定义完整性:具体实际数据库的约束由应用环境决定,反映了具体应用所涉及的数据必须满足的要求。(比如定义某行不能为空)约束主要完成对数据的检查和限制,保证数据库的完整性。二。约束1.主键约束(PRIMARYKEY)主键约束列不允许重复,也不允许空值。创建单列主键有两种方法:一种是直接在字段中添加主键关键字:CREATETABLEStudent(idINTPRIMARYKEY,nameVARCHAR(20),)另一种是添加附加约束:CREATETABLEstudent(idINTNOTNULL,nameVARCHAR(20),CONSTRAINTPK_STUD_IDPRIMARYKEY(id)//PK_STUD_ID为约束的名称)联合主键有时一列的字段可能重复,可以将多个列组合为主键。CREATETABLEStudent(nameVARCHAR(20),classVARCHAR(20),CONSTRAINTPK_STUD_IDPRIMARYKEY(name,class))其他操作//删除主键约束ALTERTABLE表名DROPPRIMARYKEY;//添加主键ALTERTABLE表名ADDPRIMARYKEY(列名);//修改主键ALTERTABLE表名MODIFY列名数据类型PRIMARYKEY;2.外键约束(FOREIGNKEY)外键约束是为了保证一个或两个表之间的参照完整性,保持数据的一致性。实现一对一或一对多关系。创建外键约束CREATETABLEclasses(idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(20));//第一种:添加关键字CREATETABLEstudent(idINTAUTO_INCREMENT,nameVARCHAR(20),CONSTRAINTPK_IDPRIMARYKEY(id),class_idINTREFERENCESclasses(id))//第二种:extraDeclareCREATETABLEStudent(idINTAUTO_INCREMENT,nameVARCHAR(20),CONSTRAINTPK_IDPRIMARYKEY(id),class_idINT,CONSTRAINTfk_class_idFOREIGNKEY(classe_id)REFERENCESclasses(id))外键约束要求父表和子表必须使用相同的存储引擎,禁止使用临时表数据表存储引擎只能是InnoDB,default-storage-engine-INNODB外键列和引用列必须有相似的数据类型,数字的长度或符号位必须相同,字符的长度可以是不同的。外键列和引用列必须建立索引,如果外键列没有索引,MySQL会自动建立索引。设置引用列:FOREIGNKEY(id)PEFERENCESprovinces(id)外键约束的引用操作CASCADE:从父表删除或更新并自动删除或更新子表中的匹配行SETNULL:删除或更新父表中的行,并将子表中的外键列设置为NULL。如果使用该选项,必须保证子表列不指定NOTNULLRESTRICT:拒绝对父表的删除或更新操作NOACTION:标准SQL的关键字,在MySQL中同RESTRICT其他操作//删除外键约束ALTERTABLE表名DROPFOREIGNKEY外键约束名;(创建外键的方法没有指定约束名,系统会默认给外键约束分配一个外键约束名,命名为student_ibfk_n)//添加外键约束ALTERTABLE表名ADDFOREIGNKEY列名REFERENCES父表(对应的列名);3、***约束(UNIQUE)规定表中某一列或多列不能有相同的两行或两行以上的数据,***约束可以保证记录的完整性。***约束字段可以为null(允许有多个null值,但最终只存储一个)每个数据表可以有多个***约束UNIQUEKEY的目的:主要用于数据时防止重复被插入。CREATETABLEStudent(nameCHAR(20)UNIQUEKEY);为表中的列添加UNIQUEKEYALTERTABLEstudentMODIFYCHAR(20)UNIQUEKEY;4、非空约束(NOTNULL)的输入值必须是非空的,需要注意的是允许的控制不能太多,太多会消耗更多的数据库性能。创建TABLEStudent(nameCHAR(20)NOTNULL);5.默认约束(DEFAULT)默认约束有如下要求:定义的常量必须与列的数据类型、精度等相匹配。每一列只能定义一个DEFAULT约束。DEFAULT约束会在使用INSERT语句时这里需要说明的是DEFAULT后面不能跟SQLServer那样的函数,只能跟常量。官方文档原文:除了一个例外,默认值必须是常量;它不能是函数或表达式。如果我们想获取当前时间,可以使用CURRENT_TIMESTAMPCREATETABLEstudent(joinTimeDATETIMEDEFAULTCURRENT_TIMESTAMP);6.CHECK约束CHECK约束,校验数据,比如性别只能是female或者male,不能是其他。MySQL不支持检查约束,但是可以使用检查约束,但是没有作用。