一.主键:

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和所在班级nameselect s.id,s.name,c.name as classNamefrom tbl_student sjoin 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的驾照信息  1001select *from tbl_cardwhere 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,和所选课程的nameselect s.id,s.name,c.name as courseNamefrom tbl_student sjoin tbl_student_course_relation scr on s.id=scr.student_idjoin tbl_course c on scr.course_id=c.idwhere s.name like 'z%'

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

SQL语句中的主键和外键相关推荐

  1. 如何列出引用SQL Server中给定表的所有外键?

    我需要在SQL Server数据库中删除一个高度引用的表. 我如何获取要删除表需要删除的所有外键约束的列表? (与在Management Studio的GUI中单击相比,SQL的答案更好.) #1楼 ...

  2. sql语句创建表的同时添加外键约束

    sql语句创建表的同时添加外键约束 题目 建立一个商店的数据库store,记录顾客及其购物情况,由下面三个表组成: 商品(商品号,商品名,单价,商品类别,供应商): 顾客(顾客号,姓名,住址): 订单 ...

  3. SQL Server中的递归CTE和外键引用

    介绍 (Introduction) Foreign key constraints are a powerful mechanism for preserving referential integr ...

  4. Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”

    Sql语句中两个比较迷糊的概念:"连接查询" 与 "外键约束 Sql 中的连接查询:就是为了避免笛卡尔积,因为涉及到多表查询的化,不使用连接查询,会先将多个互相乘,求出笛 ...

  5. sql中的主键和外键

    主键 主键的定义 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY 约束来 ...

  6. 数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量

    文章目录 前言 一.主键.联合主键和复合主键 (一)主键 (二)联合主键 (三)复合主键 二.外键.设置种子数目和增量 (一)外键的概念 (二)添加外键 (三)设置种子数目和增量 结语 前言 这篇文章 ...

  7. oracle中主键创建的语法,Oracle中主键、外键、索引、序列、唯一性约束的创建

    1.主键的创建 方法一:直接在sql语句中声明字段主键约束 create table table_name (id type[length] constraint pk_name primary ke ...

  8. oracle 其他用户表主键,Oracle中查看所有的表,用户表,列名,主键,外键

    在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 : select table_name from user_ ...

  9. SQL数据库语言基础之SqlServer数据表的六大约束(主键、外键、检查、非空、唯一性、默认值约束)的创建

    文章目录 一.主键约束(primary key) 二.外键约束(foreign key) 三.检查约束(check) 四.非空约束(not null) 五.唯一性约束(unique) 六.默认值约束( ...

  10. sql server 快照_在SQL Server合并复制中应用快照时出现外键问题

    sql server 快照 This article will review specific SQL Server merge replication issues related to forei ...

最新文章

  1. 整理一下这几天找到的一些好东西~
  2. 回家 Bessie Come Home
  3. Solr分组聚合查询之Group
  4. WordPress 短代码集
  5. jdk8中对HashMap做了哪些改变?
  6. 1.3 Go语言基础之数据类型
  7. 基于.NET的分词软件设计与实现V1.0--总体思路及算法实现
  8. php判断数值大小_php 快速判断一个数字属于什么范围的实现方法
  9. 基于Springboot的个人健康监控管理系统 毕业论文+项目源码、
  10. Excel K4宏病毒专杀
  11. 算法11 抓住波粒二象性的火星人
  12. FWT快速沃尔什变换及其应用
  13. Ubuntu20.04使用清华源下载Qt
  14. 怎么在CAD三维图面上添加一长段说明文字?
  15. 【opencv4.3.0教程】09之转换颜色空间(cvtColor)及类型(convertTo)
  16. 地使用分类数据下载介绍
  17. 韦东山第1期-学习笔记-4
  18. java实现短链接得到长链接!!!
  19. 正点原子 linux 开发板学习 uboot 篇 一
  20. ACM进阶计划(来自于南阳理工学院)

热门文章

  1. Java抽象类与接口的区别:
  2. SqlServer数据库分离与附加
  3. 第二阶段个人工作总结03
  4. 用户事件的存储与分析
  5. hdu 2837 Calculation
  6. jquery.event 研究学习之bind篇
  7. FGMap一个仿GoogleMap的WebGIS客户端
  8. ATT CFO将于6月告退 公司审计官接任
  9. IE8下window.open出现的bug
  10. 浅谈Tomcat接收到一个请求后在其内部的执行流程(源码)