SQL语句中的主键和外键

这篇具有很好参考价值的文章主要介绍了SQL语句中的主键和外键。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 一.主键:

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.3)共享主键:由另一张表的类型和长度决定
                       tbl_person         tbl_card
                   id     name        id     name
                   1001   zs          1001    card1
                   1002   ls

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

   二.外键:

2.1)外键定义:

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

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

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

 2.3)外键出现的情况:

补充:

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

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

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

              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'

                                                     b)唯一外键:
                                                       tbl_person             tbl_card
                                                        id     name            id     name     person_id(唯一性约束)
                                                       1001   zs              111    card1    1001
                                                       1002   ls              222    card2    1002
                                                       1003   ww              333    card3    1003

                                                       一对一就是一种特殊的一对多,操作跟一对多完全一样。 


                            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%'

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

       SQL语句中的主键和外键       

 文章来源地址https://www.toymoban.com/news/detail-404778.html

 

到了这里,关于SQL语句中的主键和外键的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文彻底搞清楚MySQL的主键、外键、约束和各种索引

    主键用于唯一标识表中每一行数据,外键用于建立表与表之间关联关系,约束用于限制表中数据的规则,索引用于加速查询。 主键是一种用于唯一标识表中每一行数据的标识符。在Mysql中,主键可以是一个或多个列的组合,但是必须满足以下条件: 主键列的值必须唯一,不能

    2024年02月08日
    浏览(29)
  • SQL Server:主键与外键设置与相关理解

    主键:表中能够唯一地辨别事物的属性。通过主键能够查询出表中一条完整的记录,同时使用主键能防止表中出现重复的记录,避免了数据的冗余。 外键:通俗讲就是表中一个属性是来自另一张表的主键,该属性被称为该表的外键,外键可以有不止一个。外键存在的意义就是

    2023年04月09日
    浏览(27)
  • 通过sql语句查询出某个字段在数据库中的某个表

    新入职的小伙伴,肯定还没熟悉数据库中表于表的关系以及表中的字段的含义是什么,就需要进行需求开发,导致会出现对某个字段在哪张表里面都分辨不清,不过不要怕,可以利用已下sql语句快速找到。(要注意的是,此方法可能不适用于所有类型的数据库系统,但对于大

    2024年02月16日
    浏览(55)
  • 【MySQL】外键约束和外键策略

             外键约束 ( FOREIGN KEY ,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。         外键是指表中某个字段的值依赖于另一张表中某个字段的值,而 被依赖的

    2024年02月03日
    浏览(34)
  • Sqlserver查看表的主键,删除主键,修改主键

    1.查看表的结构 EXEC sp_help \\\'表名\\\'; 查询使用 sp_help 存储过程,它将返回有关表的详细信息,包括列名、数据类型、约束等。在结果中查找带有 “PK” 标记的列,它们表示主键约束。 2.查看表的主键信息 EXEC sp_pkeys \\\'表名\\\'; 查询使用 sp_pkeys 存储过程,它将返回指定表的主键信息

    2024年02月07日
    浏览(27)
  • HIVE SQL 根据主键去重并实现其余字段分组聚合

    相同个人id下所有字段按时间顺序补位,取首个不为空值 * 注意:此处是取的首个不为空(即不为null)的字段,所以在实际使用过程中应提前将空字符串转为null值。

    2024年02月16日
    浏览(31)
  • 分布式系统的主键生成方案对比

    ​UUID(通用唯一识别码)是由32个十六进制数组成的 无序字符串 ,通过一定的算法计算出来。为了保证其唯一性,UUID规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。一般来说,算法可以保证任何地

    2024年02月08日
    浏览(30)
  • Django之主键外键详解

    在ORM操作处了解的文章中,我们已经初步接触到了主键与外键的字段定义,那么本文以详细介绍主键外键的使用方法等 1.外键 在Django中,外键是一种关系字段,用于建立不同模型之间的关联关系。外键字段允许一个模型引用另一个模型的主键,从而创建模型之间的关系。 使

    2024年02月07日
    浏览(25)
  • mysql的主键索引为什么不能null

    这是一个非常奇怪且有趣的问题。可以通过官方文档进行解读 https://dev.mysql.com/doc/refman/5.7/en/glossary.html A special value in SQL, indicating the absence of data. Any arithmetic operation or equality test involving a NULL value, in turn produces a NULL result. (Thus it is similar to the IEEE floating-point concept of NaN, “not

    2024年02月14日
    浏览(48)
  • 【MySQL】更改表的主键报错及解决办法

    报错: [HY000][3750] Unable to create or change a table without a primary key, when the system variable ‘sql_require_primary_key’ is set. Add a primary key to the table or unset this variable to avoid this message. Note that tables without a primary key can cause performance problems in row-based replication, so please consult your DBA before changing

    2024年01月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包