ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL之senior(八)——约束

2021-10-21 22:04:16  阅读:179  来源: 互联网

标签:primary 约束 键值 key MySQL cno senior 主键


MySQL之senior(八)——约束

not null 与 unique

  1. 定义:

    约束对应的英语单词:constraint ​ 在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性

  2. 约束包括哪些? 非空约束:not null 只有列级约束,没有表级约束! 唯一性约束: unique unique约束的字段不能重复,但是可以为NULL。 主键约束: primary key (简称PK) 外键约束:foreign key(简称FK) 检查约束:check(mysql不支持,oracle支持) 注意:

    • 约束直接添加到列后面的,叫做列级约束

    • 约束没有添加在列的后面,这种约束被称为表级约束。

    • unique:有列级约束,有表级约束

    • primary key: 有列级约束(推荐),有表级约束

    • 需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束。

    • 在mysql当中,一个字段同时被not null和unique约束,该字段自动变成主键字段。(oracle不是)

       

主键约束: primary key (PK)

  1. 主键: 主键值是每一行记录的唯一标识。 主键值是每一行记录的身份证号 任何一张表都应该有主键,没有主键,表无效!! 主键的特征:not null + unique(主键值不能是NULL,同时也不能重复!)

  2. 列级约束与表级约束

 create table t_vip(
     id int primary key,  # 列级约束
     name varchar(255),
 );
 create table t_vip(
     id int,
     name varchar(255),
     primary key(id)  # 表级约束
 );

 

  1. 单一主键与复合主键

 create table t_vip(
     id int,
     name varchar(255),
     primary key(id)  # 表级约束 单一主键
 );
 ​
 create table t_vip(
     id int,
     name varchar(255),
     email varchar(255),
     primary key(id,name) # 复合主键
 );
 ​
 # 在实际开发中不建议使用:复合主键。建议使用单一主键!
 # 因为主键值存在的意义就是这行记录的身份证号,只要意义达到即可,单一主键可以做到。
 # 复合主键比较复杂,不建议使用
 # 一张表,主键约束只能添加1个。
  1. 冷知识

 主键除了:单一主键和复合主键之外,还可以这样进行分类?
     自然主键:主键值是一个自然数,和业务没关系。
     业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!
         
 在实际开发中使用业务主键多,还是使用自然主键多一些?
     自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。
     业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候,
     可能会影响到主键值,所以业务主键不建议使用。尽量使用自然主键。
     
 在mysql当中,有一种机制,可以帮助我们自动维护一个主键值?
 create table t_vip(
     id int primary key auto_increment,      //auto_increment表示自增,从1开始,以1递增!
     name varchar(255)
 );

外键约束:foreign key(FK)

t_class 班级表

classno(pk) classname
101 北京市大兴区亦庄镇第二中学高三1班
102 北京市大兴区亦庄镇第二中学高三2班

t_student 学生表

no(pk) name cno(FK引用t_class这张表的classno)
1 lucy 100
2 lilei 101
3 hanme 100
4 lile 100
5 zhansan 101
6 lisi 100
7 wangwu 101
8 zhaoliu 101

当cno字段没有任何约束的时候,可能会导致数据无效。可能出现一个102,但是102班级不存在。 所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束。 那么:cno字段就是外键字段。cno字段中的每一个值都是外键值。

注意:

 t_class是父表      t_student是子表
 删除表的顺序?
     先删子,再删父。
 创建表的顺序?
     先创建父,再创建子。
 删除数据的顺序?
     先删子,再删父。
 插入数据的顺序?
     先插入父,再插入子。
     
 create table t_student(
     no int primary key auto_increment,
     name varchar(255),
     cno int,
     foreign key(cno) references t_class(classno)
 );
 ​
 思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
     不一定是主键,但至少具有unique约束。
     外键值可以为NULL。

标签:primary,约束,键值,key,MySQL,cno,senior,主键
来源: https://www.cnblogs.com/doughtier/p/15435383.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有