数据库原理与应用课件第6章数据库完整性_第1页
数据库原理与应用课件第6章数据库完整性_第2页
数据库原理与应用课件第6章数据库完整性_第3页
数据库原理与应用课件第6章数据库完整性_第4页
数据库原理与应用课件第6章数据库完整性_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章数据库完整性6.1数据库完整性概述6.2数据库完整性6.3完整性约束命名子句6.4触发器6.5MySQL中的完整性约束与触发器实践6.6触发器AnIntroductiontoDatabaseSystem*6.1数据库完整性概述AnIntroductiontoDatabaseSystem*数据库的完整性

数据的正确性和相容性数据的完整性和安全性是两个不同概念数据的完整性防止数据库中存在不符合语义的数据和不正确的数据防范对象:不合语义的、不正确的数据数据的安全性保护数据库防止恶意的破坏和非法的存取防范对象:非法用户和非法操作为维护数据库的完整性,DBMS必须:

1.提供定义完整性约束条件的机制2.提供完整性检查的方法3.违约处理AnIntroductiontoDatabaseSystem*6.2数据库完整性定义和检查*1.实体完整性规则实体完整性规则:主码必须唯一且主码的各个属性都不能为空值。所谓空值,就是用于表示“不知道”、“没意义”或“空白”的值,通常用NULL表示。例如,在学生选课关系中,如果学生还没有考试,那么其成绩就还不确定,则其成绩可以用NULL表示,或让其为一个空白。但是“(学号,课号)”是主键,所以“学号”和“课号”这两个属性都不能为空值。实体完整性给出了主键取值的约束条件。*2.参照完整性规则参照完整性规则:外码或者取空值(要求外码的每个属性均为空值),或者等于被参照关系中的主码的某个值。参照完整性也称为引用完整性,参照完整性一般指多个实体或表之间的关联关系。现实世界中的实体之间往往存在着某种联系,在关系模型中,实体以及实体之间的联系都是用关系(表)来表示的,这样就自然存在着关系(表)与关系(表)之间的引用关系。参照完整性用于描述实体之间的联系。*3.用户定义完整性规则用户定义完整性规则:属性的取值应当满足用户定义的约束条件。根据应用环境的特殊要求,应用系统中的关系往往还应该满足一些特殊的约束条件。用户定义的完整性就是针对某一具体应用领域定义的数据约束条件,它反映某一具体应用涉及的数据必须满足应用语义的要求。6.2数据库完整性定义和检查*6.2.1定义实体完整性与实体完整性检查6.2.2定义参照完整性及参照完整性检查6.2.3定义用户定义的完整性与用户定义完整性检查6.2.1定义实体完整性与实体完整性检查AnIntroductiontoDatabaseSystem*1.定义实体完整性关系模型的实体完整性在CREATETABLE中用PRIMARYKEY定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即定义为表级约束条件。*【例6-1】定义学生表中的码。

CREATETABLEstudent(SnoCHAR(12)PRIMARYKEY,/*列级约束*/SnameCHAR(8),SexCHAR(2),SbirthDATE,AddrVARCHAR(50));或者CREATETABLEstudent(SnoCHAR(12),SnameCHAR(8),SexCHAR(2),SbirthDATE,AddrVARCHAR(50)PRIMARYKEY(Sno)/*表级约束*/);【例6-2】定义学生选课成绩表中的码。CREATETABLEgrade(SnoCHAR(12),CnoCHAR(4),ScoreINT,PRIMARYKEY(Sno,Cno)/*表级约束*/);*2.实体完整性检查用PRIMARYKEY短语定义了关系的主码后,每当应用程序需要对基本表插入一条记录或对主码列进行更新操作时,DBMS将按照实体完整性规则自动进行检查。主要包括∶(1)检查主码值是否唯一,如果不唯一则拒绝插入或修改;(2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。从而保证了实体完整性。6.2.2定义参照完整性与参照完整性检查AnIntroductiontoDatabaseSystem*1.定义参照完整性关系模型的参照完整性在CREATETABLE中用FOREIGNKEY短语定义外码列,用REFERENCES短语指明这些外码与其它表的主码的参照关系。*【例6-3】定义学生选课成绩表中的参照完整性。

CREATETABLEstudent(SnoCHAR(12)PRIMARYKEY,SnameCHAR(8),SexCHAR(2),SbirthDATE,AddrVARCHAR(50));CREATETABLEcourse(CnoCHAR(4)PRIMARYKEY,CpnoCHAR(4),CnameVARCHAR(50),CreditsTINYINT,);CREATETABLEgrade(SnoCHAR(12),CnoCHAR(4),ScoreINT,PRIMARYKEY(Sno,Cno),/*在表级定义实体完整性,定义“学生选课表”的主码*/FOREIGNKEY(Sno)REFERENCESstudent(Sno),/*在表级定义参照完整性,定义“学生选课成绩表”的外码,“学生选课成绩表”中“Sno”的取值是引用了“学生表”中“Sno”的取值*/FOREIGNKEY(Cno)REFERENCEScourse(Cno)/*在表级定义参照完整性,定义“学生选课成绩表”的外码,“学生选课成绩表”中“Cno”的取值是引用了“课程表”中“Cno”的取值*/);AnIntroductiontoDatabaseSystem*2.参照完整性检查参照完整性将两个表中的相应元组联系起来,因此,对被参照表和参照表进行增、删、改操作时有可能破坏参照完整性,必须进行检查以保证这两个表的相容性。(1)拒绝(NOACTION)执行,不允许该操作执行,该策略一般设置为默认策略;(2)级联(CASCADE)操作,当删除或修改被参照表(如“学生表”)的一个元组导致与参照表(如“学生选课成绩表”)不一致时,删除或修改参照表中的所有产生不一致的元组;(3)设置为空值,当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有产生不一致元组的对应属性设置为空值。*【例6-4】定义学生选课成绩表,如果存在外码则说明违约处理原则。CREATETABLEgrade(SnoCHAR(12)CnoCHAR(4)ScoreINT,PRIMARYKEY(Sno,Cno),FOREIGNKEY(Sno)REFERENCESStudent(Sno)ONDELETECASCADE/*当删除“学生表”中的元组时,级联删除“学生选课成绩表”中相应的元组*/ONUPDATECASCADE,/*当更新“学生表”中的“学号”属性时,级联更新“学生选课成绩表”中相应的元组*/FOREIGNKEY(Cno)REFERENCEScourse(Cno)ONDELETENOACTION/*当删除“课程表”中的元组造成与“学生选课成绩表”不一致时,拒绝删除*/ONUPDATECASCADE/*当更新“课程表”中的“课号”属性时,级联更新“学生选课成绩表”中相应的元组*/);6.2.3定义用户定义的完整性与用户定义的完整性检查AnIntroductiontoDatabaseSystem*1.定义用户定义的完整性前面已经提到用户定义的完整性是针对某一具体应用的数据必须满足的语义要求。目前使用的DBMS基本都提供了定义和检验这类完整性的机制,主要包括属性上约束条件的定义和检查、元组上约束条件的定义和检查。2.属性上约束条件的定义和检查在CREATETABLE中定义属性的同时,可以根据应用要求定义属性上的约束条件,如定义列值非空(NOTNULL)、列值唯一(UNIQUE)、检查列值是否满足某个条件(CHECK短语)等。*【例6-5】定义学生选课成绩表,并要求学号、课号属性不允许取空值,成绩属性的取值在0到100之间。CREATETABLEgrade(SnoCHAR(12)NOTNULL,CnoCnoCHAR(4)NOTNULL,ScoreINTCHECK(成绩>=0AND成绩<=100),PRIMARYKEY(Sno,Cno),);【例6-6】定义学生表,要求“姓名”属性取值唯一,“性别”属性只允许取“男”或“女”。CREATETABLEstudent(SnoCHAR(12)PRIMARYKEY,SnameCHAR(8)UNIQUE,SexCHAR(2)CHECK(SexIN(‘男’,’女’)),SbirthDATE,AddrVARCHAR(50));AnIntroductiontoDatabaseSystem*3.元组上约束条件的定义和检查与属性上约束条件的定义类似,在CREATETABLE语句中可以用CHECK短语定义元组上的约束条件,元组级的约束条件可以设置不同属性之间的取值的相互约束条件。AnIntroductiontoDatabaseSystem*【例6-7】定义学生表时,要求女生姓名后加“同学”。CREATETABLEstudent(SnoCHAR(12)PRIMARYKEY,SnameCHAR(8)UNIQUE,SexCHAR(2)CHECK(SexIN(‘男’,’女’)),SbirthDATE,AddrVARCHAR(50),CHECK(Sex=’女’ANDSnameLIKE‘%同学’))当往表中插入元组或修改属性的值时,数据库管理系统将检查元组上的约束条件是否被满足,如果不满足则操作被拒绝执行。6.3完整性约束命名子句AnIntroductiontoDatabaseSystem*

上节提到的完整性约束包括主键约束、唯一约束、检查约束、外键约束等,都在CREATETABLE子句中定义。此时DBMS会自动为定义的约束生成一个随机的名称,如果要为这些约束指定名称,则需要使用CONSTRAINT关键字。AnIntroductiontoDatabaseSystem*【例6-8】使用CONSTRAINT关键字,定义学生表中的主键约束。CREATETABLEstudent(SnoCHAR(12),SnameCHAR(8),SexCHAR(2),SbirthDATE,AddrVARCHAR(50),CONSTRAINTpk_noPRIMARYKEY(Sno)/*使用约束命名子句定义主键约束*/);AnIntroductiontoDatabaseSystem*【例6-9】使用CONSTRAINT关键字,定义学生选课成绩表中的外键约束。CREATETABLEgrade(SnoCHAR(12),CnoCHAR(4),ScoreINT,CONSTRAINTpk_idPRIMARYKEY(Sno,Cno),CONSTRAINTfk_idFOREIGNKEY(Sno)REFERENCESstudent(Sno)ONDELETECASCADE/*使用约束命名子句定义外键约束*/);*【例6-10】使用CONSTRAINT关键字,定义学生表中“姓名”属性值的唯一约束,和“性别”属性值的检查约束。CREATETABLEstudent(SnoCHAR(12),SnameCHAR(8),SexCHAR(2),SbirthDATE,AddrVARCHAR(50),CONSTRAINTpk_noPRIMARYKEY(Sno),CONSTRAINTuk_nameUNIQUE(Sname),/*使用约束命名子句定义属性值唯一约束*/CONSTRAINTck_sexCHECK(SexIN(‘男’,’女’))/*使用约束命名子句定义属性值检查约束*/);6.4触发器6.4.1定义触发器

6.4.2激活触发器

6.4.3删除触发器

AnIntroductiontoDatabaseSystem*触发器触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。触发器创建之后将被保存在数据库服务器中。当用户对表进行增、删、改操作时,服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。触发器分为AFTER触发器和BEFORE触发器两种。AFTER触发器是在触发它的操作(如INSERT、UPDATE和DELETE)之后触发当前所创建的触发器,如果触发的操作失败,则此触发器不会执行。BEFORE触发器是在触发它的操作(如INSERT、UPDATE和DELETE)之前触发当前所创建的触发器,然后执行触发的操作。触发器先于触发的操作执行,用于对触发的操作数据进行前期判断,按情况修改数据。AnIntroductiontoDatabaseSystem*6.4.1定义触发器创建触发器的语法如下:

CREATETRIGGER<触发器名>{BEFORE|AFTER}<INSERT|DELETE|UPDATE>ON<表名>FOREACH{ROW|STATEMENT}<触发体>AnIntroductiontoDatabaseSystem*定义触发器的语法说明:(1)只有创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器。触发器的具体数量由具体的数据库管理系统在设计时确定。(2)触发器名可以包含模式名,也可以不包含模式名。同一模式下,触发器名必须是唯一的,并且触发器名和表名必须在同一模式下。(3)触发器只能定义在基本表上,不能定义在视图上。当基本表的数据发生变化时,将激活定义在该表上相应触发事件的触发器。(4)触发事件可以是INSERT、DELETE或UPDATE,也可以是这几个事件的组合AFTER表示在触发事件的操作执行之后激活触发器;BEFORE表示在触发事件的操作执行之前激活触发器。(5)触发器按照所触发动作的间隔尺寸可以分为行级触发器(FOREACHROW)和语句级触发器(FOREACHSTATEMENT)。(6)触发体既可以是一个匿名PLSQL过程块,也可以是对已创建存储过程的调用,还可以是一个SQL语句。如果触发体执行失败,激活触发器的事件就会终止执行,定义触发器的基本表或触发器可能影响的其他对象不发生任何变化。AnIntroductiontoDatabaseSystem*【例6-11】创建触发器delete_trigger,该触发器将记录哪些用户删除了“学生表”中的数据,以及删除的时间。首先创建“日志信息表”rec_log,用于存储用户对表的操作;CREATETABLErec_log(uservarchar(30),dateDATE,);然后在“学生表”上创建触发器,它会在用户对“学生表”使用DELETE操作时触发,并向rec_log表中添加操作的用户名和日期。CREATETRIGGERdelete_triggerAFTERDELETEONstudentFOREACHROWINSERTINTOrec_log(user,date)VALUES(USER(),SYSDATE());*6.4.2激活触发器触发器的执行,是由触发事件激活的,并由数据库服务器自动执行一个数据表上可能定义了多个触发器同一个表上的多个触发器激活时遵循如下的执行顺序:(1)执行该表上的BEFORE触发器;(2)激活触发器的SQL语句;(3)执行该表上的AFTER触发器。*为了测试【例6-11】创建的触发器是否正常运行,在“学生表”中删除学号为“20418010005”的学生的记录,并查询“日志信息表”rec_log。DELETEFROMstudentWHERESno=20418010005SELECT∗FROMrec_log+-----------------+-----------------+|user|date|+----------------+-----------------+|root@localhost|2020-11-16|+-------------------+---------------+在MySQL触发器的触发体中,在列名前加上“OLD.”限定词表示变化前的值,在列名前加上“NEW.”限定词表示变化后的值。这样SQL语句就可以访问受触发语句影响的每行的列值,例如可以通过触发器实现级联更新。*【例6-12】当修改“学生表”中的“学号”属性值之后(AFTER)级联地、自动地修改“学生选课成绩表”中相应的“学号”属性值。CREATETRIGGERtr_student_gradeAFTERUPDATEONstudentFOREACHROWUPDATEgradeSETSno=NEW.SnoWHERESno=OLD.sno;在创建了该触发器之后,如果修改“学生表”中的“学号”属性的值,就会级联修改“学生选课成绩表”中相应的“学号”属性的值*6.4.3删除触发器删除触发器的SQL语法:

DROPTRIGGER<触发器名>ON<表名>;触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除。【例6-13】删除【例6-12】建立的tr_student_grade触发器DROPTRIGGERtr_student_grade;6.5MySQL中的完整性约束与触发器实践6.5.1MySQL完整性约束实践

6.5.2MySQL触发器实践

AnIntroductiontoDatabaseSystem*6.5.1MySQL完整性约束实践1.主键约束(主码约束)主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键,主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息。*(1)设置单字段主键【例6-14】在test_db数据库中创建teacher1数据表,其主键为id。MySQL语句和运行结果如下:mysql>CREATETABLEteacher1->(->idINT(11)PRIMARYKEY,->nameVARCHAR(25),->deptIdINT(11),->salaryFLOAT->);QueryOK,0rowsaffected(0.39sec)*mysql>DESCteacher1;+--------+-------------+------+-----+----------+-------+|Field|Type|Null|Key|Default|Extra|+--------+----------------+--------+------+---------+-------+|id|int(11)|NO|PRI|NULL|||name|varchar(25)|YES||NULL|||deptId|int(11)|YES||NULL|||salary|float|YES||NULL||+--------+---------------+--------+------+----------+--------+4rowsinset(0.14sec)(2)在创建表时设置联合主键【例6-15】创建数据表teacher2,假设表中没有主键id,为了唯一确定一个元组,可以把name、deptId联合起来作为主键。MySQL语句和运行结果如下:mysql>CREATETABLEteacher2->(->nameVARCHAR(25),->deptIdINT(11),->salaryFLOAT,->PRIMARYKEY(name,deptId)->);QueryOK,0rowsaffected(0.39sec)*mysql>DESCteacher2;+--------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+--------+-------------+------+-----+---------+-------+|name|varchar(25)|NO|PRI|NULL|||deptId|int(11)|NO|PRI|NULL|||salary|float|YES||NULL||+--------+-------------+------+-----+---------+-------+3rowsinset(0.14sec)(3)在修改表时添加主键约束【例6-16】创建并查看teacher3数据表的表结构。MySQL语句和运行结果如下:mysql>CREATETABLEteacher3->(->idINT(11),->nameVARCHAR(25),->deptIdINT(11),->salaryFLOAT->);*mysql>DESCteacher3;+--------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+--------+-------------+------+-----+---------+-------+|id|int(11)|NO||NULL|||name|varchar(25)|YES||NULL|||deptId|int(11)|YES||NULL|||salary|float|YES||NULL||+--------+-------------+------+-----+---------+-------+4rowsinset(0.14sec)【例6-17】修改数据表teacher3,将字段id设置为主键。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher3->ADDPRIMARYKEY(id);QueryOK,0rowsaffected(0.94sec)Records:0Duplicates:0Warnings:0*mysql>DESCteacher3;+--------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+--------+-------------+------+-----+---------+-------+|id|int(11)|NO|PRI|NULL|||name|varchar(25)|YES||NULL|||deptId|int(11)|YES||NULL|||salary|float|YES||NULL||+--------+-------------+------+-----+---------+-------+4rowsinset(0.12sec)(4)删除主键约束【例6-18】删除teacher3表中的主键约束。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher3->DROPPRIMARYKEY;QueryOK,0rowsaffected(0.94sec)Records:0Duplicates:0Warnings:0*2.外键约束(外码约束)外键约束经常和主键约束一起使用,用来确保数据的一致性。*(1)在创建表时设置外键约束【例6-19】为了展现表与表之间的外键关系,在test_db数据库中创建一个部门表teacher_dept1,mysql>CREATETABLEteacher_dept1->(->idINT(11)PRIMARYKEY,->nameVARCHAR(22)NOTNULL,->locationVARCHAR(50)->);QueryOK,0rowsaffected(0.37sec)*创建数据表teacher4,并在表teacher4上创建外键约束,让其属性deptId作为外键关联到表teacher_dept1的主键id。MySQL语句和运行结果如下:mysql>CREATETABLEteacher4->(->idINT(11)PRIMARYKEY,->nameVARCHAR(25),->deptIdINT(11),->salaryFLOAT,->CONSTRAINTfk_teacher_dept1->FOREIGNKEY(deptId)REFERENCESteacher_dept1(id)->);QueryOK,0rowsaffected(0.37sec)*mysql>DESCteacher4;+--------+---------------+--------+--------+---------+-------+|Field|Type|Null|Key|Default|Extra|+--------+---------------+--------+--------+---------+--------+|id|int(11)|NO|PRI|NULL|||name|varchar(25)|YES||NULL|||deptId|int(11)|YES|MUL|NULL|||salary|float|YES||NULL||+--------+-------------+----------+--------+---------+---------+4rowsinset(1.33sec)(2)在修改表时添加外键约束【例6-20】修改数据表teacher2,将字段deptId设置为外键,与数据表teacher_dept1的主键id进行关联。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher2->ADDCONSTRAINTfk_teacher_dept2->FOREIGNKEY(deptId)->REFERENCESteacher_dept1(id);QueryOK,0rowsaffected(1.38sec)Records:0Duplicates:0Warnings:0*(3)删除外键约束【例6-21】删除数据表teacher2中的外键约束fk_teacher_dept2。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher2->DROPFOREIGNKEYfk_teacher_dept2;QueryOK,0rowsaffected(0.19sec)Records:0Duplicates:0Warnings:0*3.唯一约束唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性。与主键约束不同的是,唯一约束在一个表中可以有多个,并且设置唯一约束的列是允许有空值。例如,在“学生表”中,要避免表中的学生重名,就可以把“姓名”列设置为唯一约束。*(1)在创建表时设置唯一约束【例6-22】创建数据表teacher_dept2,指定部门的名称唯一。MySQL语句和运行结果如下:mysql>CREATETABLEteacher_dept2->(->idINT(11)PRIMARYKEY,->nameVARCHAR(22)UNIQUE,->locationVARCHAR(50)->);QueryOK,0rowsaffected(0.37sec)*mysql>DESCteacher_dept2;+----------+-------------+--------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+----------+--------------+-------+------+---------+-------+|id|int(11)|NO|PRI|NULL|||name|varchar(22)|YES|UNI|NULL|||location|varchar(50)|YES||NULL||+----------+--------------+------+------+---------+---------+3rowsinset(0.08sec)(2)在修改表时添加唯一约束【例6-23】修改数据表teacher_dept1指定部门的名称唯一。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher_dept1->ADDCONSTRAINTunique_nameUNIQUE(name);QueryOK,0rowsaffected(0.63sec)Records:0Duplicates:0Warnings:0*mysql>DESCteacher_dept1;+----------+-------------+------+-----+---------+-----------+|Field|Type|Null|Key|Default|Extra|+----------+--------------+-------+-----+-----------+--------+|id|int(11)|NO|PRI|NULL|||name|varchar(22)|NO|UNI|NULL|||location|varchar(50)|YES||NULL||+----------+--------------+------+------+----------+---------+3rowsinset(0.00sec)(3)删除唯一约束【例6-24】删除数据表teacher_dept1中的唯一约束unique_name。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher_dept1->DROPINDEXunique_name;QueryOK,0rowsaffected(0.20sec)Records:0Duplicates:0Warnings:0*mysql>DESCteacher_dept1;+----------+----------------+---------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+---------+-----------------+---------+-----+---------+-------+|id|int(11)|NO|PRI|NULL|||name|varchar(22)|NO||NULL|||location|varchar(50)|YES||NULL||+----------+-----------------+--------+-----+------------+------+3rowsinset(0.00sec)4.检查约束检查约束是用来检查数据表中,字段值是否有效的一个手段。例如,“课程表”中的学分字段是没有负数的,并且数值也是有限制的。在设置字段的检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。*(1)在创建表时设置检查约束【例6-25】在test_db数据库中创建teacher5数据表,要求salary字段值大于0且小于10000。MySQL语句和运行结果如下:mysql>CREATETABLEteacher5->(->idINT(11)PRIMARYKEY,->nameVARCHAR(25),->deptIdINT(11),->salaryFLOAT,->CHECK(salary>0ANDsalary<100),->FOREIGNKEY(deptId)REFERENCESteacher_dept1(id)->);QueryOK,0rowsaffected(0.39sec)*(2)在修改表时添加检查约束

【例6-26】修改teacher5数据表,要求id字段值大于0。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher5->ADDCONSTRAINTcheck_id->CHECK(id>0);QueryOK,0rowsaffected(0.19sec)Records:0Duplicates:0Warnings:0*(3)删除检查约束

【例6-27】删除teacher5表中的check_id检查约束。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher5->DROPCONSTRAINTcheck_id;QueryOK,0rowsaffected(0.19sec)Records:0Duplicates:0Warnings:0*5.非空约束非空约束用来约束表中的字段不能为空。例如,在“学生表”中,规定“姓名”列非空,如果不添加学生姓名,那么这条记录无用。*(1)在创建表时设置非空约束【例6-28】创建数据表teacher_dept3,指定部门名称不能为空。MySQL语句和运行结果如下:mysql>CREATETABLEteacher_dept3->(->idINT(11)PRIMARYKEY,->nameVARCHAR(22)NOTNULL,->locationVARCHAR(50)->);QueryOK,0rowsaffected(0.37sec)*mysql>DESCteacher_dept3;+----------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+----------+-------------+------+-----+---------+-------+|id|int(11)|NO|PRI|NULL|||name|varchar(22)|NO||NULL|||location|varchar(50)|YES||NULL||+----------+-------------+------+-----+---------+-------+3rowsinset(0.06sec)(2)在修改表时添加非空约束【例6-29】修改数据表teacher_dept3,指定部门位置不能为空。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher_dept3->CHANGECOLUMNlocation->locationVARCHAR(50)NOTNULL;QueryOK,0rowsaffected(0.15sec)Records:0Duplicates:0Warnings:0*mysql>DESCteacher_dept3;+----------+-------------+------+-----+----------+-------+|Field|Type|Null|Key|Default|Extra|+----------+-------------+--------+-----+---------+-------+|id|int(11)|NO|PRI|NULL|||name|varchar(22)|NO||NULL|||location|varchar(50)|NO||NULL||+----------+--------------+--------+------+---------+-----+3rowsinset(0.00sec)(3)删除非空约束【例6-30】修改数据表teacher_dept3,将部门位置的非空约束删除。MySQL语句和运行结果如下:。mysql>ALTERTABLEteacher_dept3->CHANGECOLUMNlocation->locationVARCHAR(50)NULL;QueryOK,0rowsaffected(0.15sec)Records:0Duplicates:0Warnings:0*mysql>DESCteacher_dept3;+----------+-------------+------+-----+----------+-------+|Field|Type|Null|Key|Default|Extra|+----------+-------------+------+-----+----------+-------+|id|int(11)|NO|PRI|NULL|||name|varchar(22)|NO||NULL|||location|varchar(50)|YES||NULL||+----------+-------------+------+------+---------+--------+3rowsinset(0.00sec)6.默认值约束默认值约束用来约束当数据表中某个字段不输入值时,自动为其添加一个已经设置好的值。例如,在插入学生信息时,如果不输入学生的性别,那么会默认设置一个性别或者输入一个“未知”。默认值约束通常用在已经设置了非空约束的列,这样能够防止数据表在录入数据时出现错误。*(1)在创建表时设置默认值约束【例6-31】创建数据表teacher_dept4,指定部门位置默认为Xian。MySQL语句和运行结果如下:mysql>CREATETABLEteacher_dept4->(->idINT(11)PRIMARYKEY,->nameVARCHAR(22),->locationVARCHAR(50)DEFAULT'Xian'->);QueryOK,0rowsaffected(0.37sec)*mysql>DESCteacher_dept4;+----------+-------------+----------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+----------+--------------+---------+-----+---------+-------+|id|int(11)|NO|PRI|NULL|||name|varchar(22)|YES||NULL|||location|varchar(50)|YES||Xian||+----------+--------------+--------+-----+---------+---------+3rowsinset(0.06sec)(2)在修改表时添加默认值约束【例6-32】修改数据表teacher_dept4,将部门位置的默认值修改为Shanghai。MySQL语句和运行结果如下:mysql>ALTERTABLEteacher_dept4->CHANGECOLUMNlocation->locationVARCHAR(50)DEFAULT'Shanghai';QueryOK,0rowsaffected(0.15sec)Records:0Duplicates:0Warnings:0*mysql>DESCteacher_dept4;+----------+-------------+------+-----+----------+-------+|Field|Type|Null|Key|D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论