热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MySQL心得5-2--约束_MySQL

MySQL心得5-2--约束
bitsCN.com 1. 主键约束 主键就是表中的一列或多个列的一组,其值能唯一地标志表中的每一行。通过定义PRIMARY KEY约束来创建主键,而且PRIMARY KEY约束中的列不能取空值。由于PRIMARY KEY约束能确保数据的唯一,所以经常用来定义标志列。当为表定义PRIMARY KEY约束时,MySQL为主键列创建唯一性索引,实现数据的唯一性,在查询中使用主键时,该索引可用来对数据进行快速访问。如果 PRIMARY KEY 约束是由多列组合定义的,则某一列的值可以重复,但PRIMARY KEY 约束定义中所有列的组合值必须唯一。 可以用两种方式定义主键:作为列或表的完整性约束。作为列的完整性约束时,只需在列定义的时候加上关键字PRIMARY KEY,作为表的完整性约束时,需要在语句最后加上一条PRIMARY KEY(col_name,…)语句。 例: 创建表XS1,将姓名定义为主键。 CREATE TABLE XS1( 学号 varchar(6) NULL, 姓名 varchar(8) NOT NULL PRIMARY KEY , 出生日期 datetime ); 说明:例中主键定义于空指定之后,空指定也可以在主键之后指定. 当表中的主键为复合主键时(即两个字段是主键时),只能定义为表的完整性约束。 例: 创建course表来记录每门课程的学生学号、姓名、课程号、学分和毕业日期。其中学号、课程号和毕业日期构成复合主键。 CREATE TABLE course( 学号 varchar(6) NOT NULL, 姓名 varchar(8) NOT NULL, 毕业日期 date NOTNULL, 课程号 varchar(3) , 学分 tinyint , PRIMARY KEY (学号, 课程号, 毕业日期)); 如果作为主键的一部分的一个列没有定义为NOT NULL,MySQL就自动把这个列定义为NOT NULL。实际上,在例中,可以忽略姓名列中的NOT NULL声明,但是为了清楚起见,最好包含这个空指定。 2. 原则上,任何列或者列的组合都可以充当一个主键。制定但是主键列必须遵守一些规则。这些规则源自于关系模型理论和MySQL所的规则: (1)每个表只能定义一个主键。来自关系模型的这一规则也适用于MySQL。 (2)关系模型理论要求必须为每个表定义一个主键。然而,MySQL并不要求这样,可以创建一个没有主键的表。但是,从安全角度应该为每个基础表指定一个主键。主要原因在于,没有主键,可能在一个表中存储两个相同的行。因此,两个行不能彼此区分。在查询过程中,它们将会满足同样的条件,在更新的时候也总是一起更新,可能会导致数据库崩溃。 (3)表中的两个不同的行在主键上不能具有相同的值。这就是唯一性规则。 (4)如果从一个复合主键中删除一列后,剩下的列构成主键仍然满足唯一性原则,那么,这个复合主键是不正确的,这条规则称为最小化规则(minimality rule)。也就是说,复合主键不应该包含一个不必要的列。 (5)一个列名在一个主键的列列表中只能出现一次。 MySQL自动地为主键创建一个索引。通常,这个索引名为PRIMARY。然而,可以重新给这个索引起名。 例: 创建例5.9中的course表,把主键创建的索引命名为INDEX_course。 CREATE TABLE course( 学号 varchar(6) NOT NULL, 姓名 varchar(8) NOT NULL, 学分 tinyint , PRIMARY KEY INDEX_course(学号, 课程号)); 3. 替代键约束(unique) 在关系模型中,替代键像主键一样,是表的一列或一组列,它们的值在任何时候都是唯一的。替代键是没有被选做主键的候选键。定义替代键的关键字是UNIQUE。 例: 在表XS1中将姓名列定义为一个替代键。 CREATE TABLE XS1( 学号 varchar(6) NULL, 姓名 varchar(8) NOT NULLUNIQUE, 出生日期 datetime NULL, PRIMARY KEY(学号)); 说明:关键字UNIQUE表示“姓名”是一个替代键,其列值必须是唯一的。 替代键也可以定义为表的完整性约束,前面语句可以这样定义: CREATE TABLE XS1( 学号 varchar(6) NULL, 姓名 varchar(8) NOTNULL, 出生日期 datetime NULL, PRIMARY KEY(学号), UNIQUE(姓名)); 4.在MySQL中替代键和主键的区别主要有以下几点。 (1)一个数据表只能创建一个主键。但一个表可以有若干个UNIQUE键,并且它们甚至可以重合,例如,在C1和C2列上定义了一个替代键,并且在C2和C3上定义了另一个替代键,这两个替代键在C2列上重合了,而MySQL允许这样。 (2)主键字段的值不允许为NULL,而UNIQUE字段的值可取NULL,但是必须使用NULL或NOTNULL声明。 (3)一般创建PRIMARY KEY约束时,系统会自动产生PRIMARY KEY索引。创建UNIQUE约束时,系统自动产生UNIQUE索引。 通过PRIMERY KEY约束和UNIQUE约束可以实现表的所谓实体完整性约束。定义为PRIMERY KEY和UNIQUE KEY的列上都不允许出现的值。 5.外键(foreign) 参照完整性约束(referential integrity constraint)是一种特殊的完整性约束,实现为一个外键。所以XS_KC表中的学号列和课程号列都可以定义为一个外键。可以在创建表或修改表时定义一个外键声明。 定义外键的语法格式已经在介绍索引时给出了,这里列出reference_definition的定义。语法格式如下: REFERENCES tbl_name [(index_col_name,...)] [ON DELETE {RESTRICT | CASCADE |SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE |SET NULL | NO ACTION}] 说明:外键被定义为表的完整性约束,reference_definition中包含了外键所参照的表和列,还可以声明参照动作。 ● tb1_name:外键所参照的表名,这个表叫做被参照表。而外键所在的表叫做参照表。 ● index_col_name:格式为col_name[(length)] [ASC | DESC] col_name:被参照的列名。外键可以引用一个或多个列,外键中的所有列值在引用的列中必须全部存在。外键可以只引用主键和替代键。外键不能引用被参照表中随机的一组列,它必须是被参照表的列的一个组合且其中的值都保证是唯一的。 ● ON DELETE | ONUPDATE:可以为每个外键定义参照动作。参照动作包含两部分: 在第一部分中,指定这个参照动作应用哪一条语句。这里有两条相关的语句,即UPDATE和DELETE语句; 在第二部分中,指定采取哪个动作。可能采取的动作是restrict、cascade、SET NULL、NO ACTION和SETDEFAULT。接下来说明这些不同动作的含义。 RESTRICT:当要删除或更新父表中被参照列上在外键中出现的值时,拒绝对父表的删除或更新操作。 CASCADE:从父表删除或更新行时自动删除或更新子表中匹配的行。 SET NULL:当从父表删除或更新行时,设置子表中与之对应的外键列为NULL。如果外键列没有指定NOT NULL限定词,这就是合法的。 NO ACTION:NO ACTION意味着不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新父表中主要键值的企图不被允许,和RESTRICT一样。 SET DEFAULT:作用和SET NULL一样,只不过SET DEFAULT是指定子表中的外键列为默认值。 如果没有指定动作,两个参照动作就会默认地使用RESTRICT。 外键目前只可以用在那些使用InnoDB存储引擎创建的表中,对于其他类型的表,MySQL服务器能够解析CREATE TABLE语句中的FOREIGN KEY语法,但不能使用或保存它。 例: 创建XS1表,所有的XS表中学生学号都必须出现在XS1表中,假设已经使用学号列作为主键创建了XS表。 CREATE TABLE XS1( 学号 varchar(6) NULL, 姓名 varchar(8) NOTNULL, 出生日期 datetime NULL, PRIMARY KEY (姓名), FOREIGN KEY (学号) REFERENCES XS (学号) ONDELETE RESTRICT ON UPDATE RESTRICT); 6.当指定一个外键的时候,以下的规则适用: (1)被参照表必须已经用一条CREATE TABLE语句创建了,或者必须是当前正在创建的表。在后一种情况下,参照表是同一个表。 (2)必须为被参照表定义主键。 (3)必须在被参照表的表名后面指定列名(或列名的组合)。这个列(或列组合)必须是这个表的主键或替代键。 (4)尽管主键是不能够包含空值的,但允许在外键中出现一个空值。这意味着,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。 (5)外键中的列的数目必须和被参照表的主键中的列的数目相同。 (6)外键中的列的数据类型必须和被参照表的主键中的列的数据类型对应相等。 与外键相关的被参照表和参照表可以是同一个表。这样的表称为自参照表(self-referencing table),这种结构称为自参照完整性(self-referentialintegrity)。 例如,可以创建这样的XS1表: CREATE TABLE XS1( 学号 varchar(6) NOTNULL, 姓名 varchar(8) NOTNULL, 出生日期 datetime NULL, PRIMARY KEY (学号), FOREIGN KEY (学号) REFERENCES XS1 (学号)); 7. check约束 每个数据库都还有一些专用的完整性约束。例如,KC表中星期数要在1~7之间,XS表中出生日期必须大于1986年1月1日。这样的规则可以使用CHECK完整性约束来指定。 CHECK完整性约束在创建表的时候定义。可以定义为列完整性约束,也可以定义为表完整性约束。语法格式为: CHECK(expr) 说明:expr是一个表达式,指定需要检查的条件,在更新表数据的时候,MySQL会检查更新后的数据行是否满足CHECK的条件。 例1: 创建表student,只考虑学号和性别两列,性别只能包含男或女。 CREATE TABLE student( 学号 char(6) NOT NULL, 性别 char(1) NOT NULL CHECK(性别 IN ('男', '女'))); 这里CHECK完整性约束指定了性别允许哪个值,由于CHECK包含在列自身的定义中,所以CHECK完整性约束被定义为列完整性约束。 例2: 创建表student1,只考虑学号和出生日期两列,出生日期必须大于1980年1月1日。 CREATE TABLE student1( 学号 char(6) NOT NULL, 出生日期 date NOT NULL CHECK(出生日期>'1980-01-01')); 前面的CHECK完整性约束中使用的表达式都很简单,MySQL还允许使用更为复杂的表达式。例如,可以在条件中加入子查询。 例: 创建表student2,只考虑学号和性别两列,并且确认性别列中的所有值来源于student表的性别列中。 CREATE TABLE student2( 学号 char(6) NOT NULL, 性别 char(1) NOT NULL CHECK( 性别 IN (SELECT 性别 FROM student))); 如果指定的完整性约束中,要相互比较一个表的两个或多个列,那么该列完整性约束必须定义表完整性约束。 例: 创建表student3,有学号、最好成绩和平均成绩3列,要求最好成绩必须大于平均成绩。 CREATE TABLE student3( 学号 char(6) NOT NULL, 最好成绩 INT(1) NOT NULL, 平均成绩 INT(1) NOT NULL, CHECK(最好成绩>平均成绩)); 也可以同时定义多个CHECK完整性约束,中间用逗号隔开。 然而,不幸的是,在目前的MySQL版本中,CHECK完整性约束还没有被强化,上面例子中定义的CHECK约束会被MySQL分析,但会被忽略,也就是说,这里的CHECK约束暂时只是一个注释,不会起任何作用。相信在未来的版本中它能得到扩展。 8. CONSTRAINT关键字 如果一条INSERT、UPDATE或DELETE语句违反了完整性约束,则MySQL返回一条出错消息并且拒绝更新,一个更新可能会导致多个完整性约束的违反。在这种情况下,应用程序获取几条出错消息。为了确切地表示是违反了哪一个完整性约束,可以为每个完整性约束分配一个名字,随后,出错消息包含这个名字,从而使得消息对于应用程序更有意义。 constraint关键字用来指定完整性约束的名字。语法格式为: CONSTRAINT [symbol] symbol为指定的名字,这个名字在完整性约束的前面被定义,在数据库里这个名字必须是唯一的。如果它没有被给出,则MySQL自动创建这个名字。只能给表完整性约束指定名字,而无法给列完整性约束指定名字。 例: 创建与例5.8中相同的XS1表,并为主键命名。 CREATE TABLE XS1( 学号 varchar(6) NULL, 姓名 varchar(8) NOT NULL, 出生日期 datetime NULL CONSTRAINTPRIMARY_KEY_XS1 PRIMARY KEY(姓名)); 说明:本例中给主键姓名分配了名字PRIMARY_KEY_XS1。 在定义完整性约束的时候应当尽可能地分配名字,以便在删除完整性约束的时候,可以更容易地引用它们。这意味着,表完整性约束比列完整性约束更受欢迎,因为不可能为后者分配一个名字。 9. DROP TABLE语句(删除) 如果使用一条DROP TABLE语句删除一个表,所有的完整性约束都自动被删除了。被参照表的所有外键也都被删除了,使用ALTER TABLE语句,完整性可以独立地被删除,而不用去删除表本身。删除的语法和删除索引的语法一样。 例: 删除表XS的主键。 ALTER TABLE XS DROP PRIMARY KEY;
作者 tianyazaiheruan bitsCN.com
推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 如何修改路由器密码?路由器登录密码和无线密码的修改方法
    本文介绍了修改路由器密码的两种方法:一是修改路由器登录口令,需要进入路由器后台进行操作;二是修改无线连接密码,通过进入路由器后台的无线设置和无线安全设置进行修改。详细步骤包括复位处理、登录路由器后台、选择系统工具、填入用户名和用户密码、保存修改等。 ... [详细]
  • 本文介绍了2019年上半年内蒙古计算机软考考试的报名通知和考试时间。考试报名时间为3月1日至3月23日,考试时间为2019年5月25日。考试分为高级、中级和初级三个级别,涵盖了多个专业资格。报名采取网上报名和网上缴费的方式进行,报考人员可登录内蒙古人事考试信息网进行报名。详细内容请点击查看。 ... [详细]
author-avatar
mobiledu2502862913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有