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和所在班级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语句中的主键和外键相关推荐
- 如何列出引用SQL Server中给定表的所有外键?
我需要在SQL Server数据库中删除一个高度引用的表. 我如何获取要删除表需要删除的所有外键约束的列表? (与在Management Studio的GUI中单击相比,SQL的答案更好.) #1楼 ...
- sql语句创建表的同时添加外键约束
sql语句创建表的同时添加外键约束 题目 建立一个商店的数据库store,记录顾客及其购物情况,由下面三个表组成: 商品(商品号,商品名,单价,商品类别,供应商): 顾客(顾客号,姓名,住址): 订单 ...
- SQL Server中的递归CTE和外键引用
介绍 (Introduction) Foreign key constraints are a powerful mechanism for preserving referential integr ...
- Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”
Sql语句中两个比较迷糊的概念:"连接查询" 与 "外键约束 Sql 中的连接查询:就是为了避免笛卡尔积,因为涉及到多表查询的化,不使用连接查询,会先将多个互相乘,求出笛 ...
- sql中的主键和外键
主键 主键的定义 主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY 约束来 ...
- 数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量
文章目录 前言 一.主键.联合主键和复合主键 (一)主键 (二)联合主键 (三)复合主键 二.外键.设置种子数目和增量 (一)外键的概念 (二)添加外键 (三)设置种子数目和增量 结语 前言 这篇文章 ...
- oracle中主键创建的语法,Oracle中主键、外键、索引、序列、唯一性约束的创建
1.主键的创建 方法一:直接在sql语句中声明字段主键约束 create table table_name (id type[length] constraint pk_name primary ke ...
- oracle 其他用户表主键,Oracle中查看所有的表,用户表,列名,主键,外键
在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 : select table_name from user_ ...
- SQL数据库语言基础之SqlServer数据表的六大约束(主键、外键、检查、非空、唯一性、默认值约束)的创建
文章目录 一.主键约束(primary key) 二.外键约束(foreign key) 三.检查约束(check) 四.非空约束(not null) 五.唯一性约束(unique) 六.默认值约束( ...
- sql server 快照_在SQL Server合并复制中应用快照时出现外键问题
sql server 快照 This article will review specific SQL Server merge replication issues related to forei ...
最新文章
- 整理一下这几天找到的一些好东西~
- 回家 Bessie Come Home
- Solr分组聚合查询之Group
- WordPress 短代码集
- jdk8中对HashMap做了哪些改变?
- 1.3 Go语言基础之数据类型
- 基于.NET的分词软件设计与实现V1.0--总体思路及算法实现
- php判断数值大小_php 快速判断一个数字属于什么范围的实现方法
- 基于Springboot的个人健康监控管理系统 毕业论文+项目源码、
- Excel K4宏病毒专杀
- 算法11 抓住波粒二象性的火星人
- FWT快速沃尔什变换及其应用
- Ubuntu20.04使用清华源下载Qt
- 怎么在CAD三维图面上添加一长段说明文字?
- 【opencv4.3.0教程】09之转换颜色空间(cvtColor)及类型(convertTo)
- 地使用分类数据下载介绍
- 韦东山第1期-学习笔记-4
- java实现短链接得到长链接!!!
- 正点原子 linux 开发板学习 uboot 篇 一
- ACM进阶计划(来自于南阳理工学院)