0

0

MySQL语句中的主键和外键怎么使用

WBOY

WBOY

发布时间:2023-06-03 12:14:02

|

3779人浏览过

|

来源于亿速云

转载

     一.主键:

    1.1)主键字段定义:

    在数据库表中,如果有一组字段能够唯一确定一条记录,则可以把它们设计成表的主键字段。

    例子:如果要创建一个人的信息表(字段:姓名,年龄,籍贯,工作单位......),那么身份证号是唯一能确定你这个人的,所以身份证号是主键。

    1.2) 创建:

    主键字段名 primary key

    1.3)主键的选取原则;

    原则上使用一个字段做主键,而且推荐使用没有业务含义的字段做主键,比如:id等。

    1.4)主键值的生成方式:

    主键字段的类型和长度由主键值的生成方式来决定:

    1.4.1)

    自增:借助数据库自身主键生成机制
               数值型 长度由数据量来决定

    创建:主键字段名 primary key not null auto_increment

    特点:

    优点:开发效率高,因为其可以自动编号且按顺序存放便于检索占用空间小,可以节省开发人员时间。

     缺点: 运行效率低且不灵活,因为其自动增长,在手动要插入或导入指定ID的数据时会很麻烦且如果数据量过大那么越到后面,数据库自增主键的时间会变长导致查询数据库的操作变慢。如果有合并表的操作时,有概率还会出现主键的重复。

    1.4.2)

    assighed:程序员手动生成主键值,唯一非空,算法.
    hi/low:数值型 长度由数据量决定
    UUID:字符串 长度是32位

    public class UUIDUtil {//java中自带UUID的算法
        public static  String getUUID(){
            return UUID.randomUUID().toString().replaceAll("-", "");
        }
    }

    特点:

    优点:主键值生成很灵活且能够保证在任何情况下都具有唯一性,数据迁移方便。                               

     缺点:占用空间大,很难记忆,会降低性能。

    1.4.4)

    联合主键:由多个字段的类型和长度决定

     二.外键:

    2.1)外键定义:

    通常用于在两个表之间建立关系。外键的主要用途是维持实体的两个独立实例之间的数据完整性。

    2.2)外键(约束)创建(不推荐使用,一般不进行外键约束,只进行外键约定):

    alert table 主键表名 add constraint FK_ID(外键名称) foreign key(外键字段名) references 外表表名(主键字段名)

     2.3)外键出现的情况:

    补充:
     在创建表的时候,表和表之间可能会存在的业务关系(关联关系),这时会产生外键。

    关联关系中存在的关系类型:

    1对1:一张表(A)中的一条记录只能对应另一张表(B)中的一条记录,另一张表(B)中的一条记录也只能对应一张表(A)中的一条记录。 

    Python开发网站指南 WORD版
    Python开发网站指南 WORD版

    本文档主要讲述的是Python开发网站指南;HTML是网络的通用语言,一种简单、通用的全置标记语言。它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器 Python和其他程序语言一样,有自身的一套流程控制语句,而且这些语句的语法和其它程序语言类似,都有for, if ,while 类的关键字来表达程序流程。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

    下载

                  eg:软工2777班和班长,公民和身份证。(商品表和该商品的描述表)

    1对多:一张表(A)中的一条记录可以对应另一张表(B)中的多条记录,另一张表(B)中的一条记录只能对应一张表(A)中的一条记录。

                  eg:商品的分类表和商品表示一对多的关系,一个商品分类下可以有多个商品,学生和班级

    多对多:(有两张表,A表中的一条数据对应B表中的多条,同时,B表中的一条对应A表中的多条)

                  eg:客户表和部门表。

     关联查询(同时利用外键查询多张表中的数据)

     关联查询的类型:

    内连接:查询所有符合条件的数据,并且要求结果在两张表中都有相对应的记录

    左外连接:查询左侧表中所有符合条件的数据,即使在右侧表中没有相对应的记录

    右外连接:查询右侧表中所有符合条件的数据,即使在左侧表中没有相对应的记录

    2.3.1)在一对多中:

    例子:A(1)---------B(n)
                 父表         子表
    tbl_student                    tbl_class
    id      name class_id          id     name
    1001    zs    111              111    class1
    1002    ls    111              222    class2
    1003    ww    222
    1004    zl    

     //查询所有姓张的学生的id,name和所在班级name
                                                 select s.id,s.name,c.name as className
                                                 from tbl_student s
                                                  join tbl_class c on s.class_id=c.id//假如外键不可以为空
                                                  where s.name like 'z%'

    张表中有相对应的记录,使用内连接。如果您想要检索所有符合条件的左侧表记录,可以使用左外连接查询

     2.3.2)在一对一中:

    tbl_person         tbl_card
    id     name        id     name
    1001   zs          1001    card1

    特点:
    a)共享主键:(不推荐)
    添加数据:先添加先产生的表,再后产生的表记录
    删除数据:先删除后产生的表记录,再删除先产生的表记录
    查询数据:无需进行连接查询:

      //查询zhangsan的驾照信息  1001
                       select *
                       from tbl_card
                       where id='1001'

    2.3.3)多对多:

    tbl_student                    tbl_course
    id     name                    id     name   
    1001   zs                      111    java   
    1002   ls                      222    mysql  
    tbl_student_course_relation
    student_id     course_id
    1001            111
    1001            222
    1002            111
    1002            222
    特点:

    添加数据时,先添加父表记录(tbl_student,tbl_course),再添加子表(tbl_student_course_relation)记录;
    删除数据时,先删除子表记录(tbl_student_course_relation),再删除父表记录(tbl_student,tbl_course)
    查询数据时,可能会进行关联查询:

      //查询所有姓张的学生的id,name,和所选课程的name
                  select s.id,s.name,c.name as courseName
                  from tbl_student s
                              join tbl_student_course_relation scr on s.id=scr.student_id
                              join tbl_course c on scr.course_id=c.id
                  where s.name like 'z%'

    三.主键和外键的区别总结:

    MySQL语句中的主键和外键怎么使用

    相关专题

    更多
    菜鸟裹裹入口以及教程汇总
    菜鸟裹裹入口以及教程汇总

    本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

    0

    2026.01.22

    Golang 性能分析与pprof调优实战
    Golang 性能分析与pprof调优实战

    本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

    9

    2026.01.22

    html编辑相关教程合集
    html编辑相关教程合集

    本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

    56

    2026.01.21

    三角洲入口地址合集
    三角洲入口地址合集

    本专题整合了三角洲入口地址合集,阅读专题下面的文章了解更多详细内容。

    51

    2026.01.21

    AO3中文版入口地址大全
    AO3中文版入口地址大全

    本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

    397

    2026.01.21

    妖精漫画入口地址合集
    妖精漫画入口地址合集

    本专题整合了妖精漫画入口地址合集,阅读专题下面的文章了解更多详细内容。

    118

    2026.01.21

    java版本选择建议
    java版本选择建议

    本专题整合了java版本相关合集,阅读专题下面的文章了解更多详细内容。

    3

    2026.01.21

    Java编译相关教程合集
    Java编译相关教程合集

    本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

    16

    2026.01.21

    C++多线程相关合集
    C++多线程相关合集

    本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

    11

    2026.01.21

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    MySQL 教程
    MySQL 教程

    共48课时 | 1.9万人学习

    MySQL 初学入门(mosh老师)
    MySQL 初学入门(mosh老师)

    共3课时 | 0.3万人学习

    简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信

    共1课时 | 805人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号