外键约束

外键约束

概念:

​ 对外键列值进行限定,如果这一列有值的话,只能是主表中主键列已经存在的值。
​ ①在创建表的同时添加
​ create table 表名(
​ 列名 数据类型,
​ 列名 数据类型,
​ …
​ constraint 约束名 foreign key(外键列名) references 主表的表名(主表中主键列名)
​ );
​ ②删除外键约束
​ alter table 表名 drop foreign key 约束名
​ ③在表创建后添加外键约束
​ alter table 表名 add constraint 约束名 foreign key(外键列名) references 主表的表名(主表中主键列名)

表与表之间的关系

​ 一对一
​ 建表原则:唯一外键,在任意一方添加一列作为外键,给外键添加唯一约束
​ 一对多
​ 建表原则:在多的一方添加一列作为外键,指向一的一方主键
​ 操作原则:
​ 添加数据:先添加一的一方,再添加多的一方
​ 删除数据:先删除多的一方,再删除一的一方
​ 多对多
​ 建表原则:需要创建一张中间表,这张表中至少包含两个字段,分别作为外键,指向多对多双方的主键。

多表查询分类:

​ 1. 内连接
​ 显式内连接(显式的使用了inner join 关键字)
​ select 字段列表 from 表1 [inner] join 表2 on 关联条件
​ 隐式内连接(没有使用inner join 关键字)
​ select 字段列表 from 表1,表2 where 关联条件
​ 内连接查询的结果
​ 查询是多张表中满足关联条件的数据
​ 2. 外连接
​ 左外连接
​ select 字段列表 from 表1 left outer join 表2 on 关联条件
​ 查询结果: 查询的是左表的全部,以及右表中满足关联条件的数据
​ 右外连接
​ select 字段列表 from 表1 right outer join 表2 on 关联条件
​ 查询结果: 查询的是右表的全部,以及左表中满足关联条件的数据
子查询
​ 概念:
​ select语句的嵌套,被嵌套的select语句被称之为子查询
​ 子查询的结果:
​ 单行单列的
​ 对子查询的结果进行单值判断
​ 多行单列的
​ 结合in关键字使用
​ 多行多列的
​ 将查询结果当成表来使用,这张表没有名字,所以必须给它起别名

自关联查询
一张表中的不同列有关联关系,需要将一张表当成多张表(起不同的别名即可)

视图
将复杂查询的结果,当成一张虚拟表
好处:
1. 简化查询操作
2. 提升安全
视图创建语法
create view 视图名称[(视图中字段列表)] as 查询语句

	注意:
		1.如果不指定视图中的字段列表,必须保证查询语句的结果中不存在重复列名,否则会直接报错。
		2.如果要自己指定视图中的列名,那么列名的个数必须和查询结果集中的列名个数一致。
删除视图
	drop view [if exists] 视图名称;
修改视图的结构
	alter view 视图名称[(视图中字段列表)] as 查询语句


存储引擎
数据库服务器中存储和管理数据的核心

mysql存储引擎的特点:
	是插件式的,针对不同的应用场景,可以选择不同的存储引擎

有哪些常见的存储引擎:
	InnoDB
	MyISAM
	Memory
	
查询数据库支持的存储引擎
	SHOW ENGINES;
查看指定数据库中所有表的存储引擎
	SHOW TABLE STATUS FROM 数据库名
查看指定数据库中指定表的存储引擎
	SHOW TABLE STATUS FROM 数据库名 WHERE name='表名'
创建表时指定存储引擎
	create table 表名(
		字段列表
	)engine=存储引擎;
	
表已经存在后修改存储引擎
	ALTER TABLE 表名 ENGINE = INNODB;
索引

索引的创建
	给指定列创建普通索引
		create index 索引名 on 表名(列名)
	给指定列创建唯一索引
		create uniuqe index 索引名 on 表名(列名)
	查看某张表的索引
		show index from 表名
通过alter表的语法添加索引
	
删除索引
	drop index 索引名  on  表名

1. 索引的概念
是一种用于快速检索的数据结构
主要作用就是提升查询效率(速度,IO次数)
另外还要知道,mysql存储引擎除了维护数据,还要维护索引这个数据结构,通常情况下索引是存储在硬盘上的。

2. 怎么理解所谓的数据库的索引就类似于书的目录?
	每本书都有目录,增加了几页纸,书的厚度变了,但是找对应的文章是不是更快了。
	一句话:空间换时间思想!
	
3.有哪些常见的数据结构,为什么最终要选择B+Tree数据结构
	a)hash表
		占用内存可能过高
		不适合进行范围查询
	b)二叉树
		如果索引值是线性增长的(比如自增主键),二叉树可能退化成链表,跟全表扫描的效果一样
	c)平衡二叉树
		相较于二叉树有了平衡的功能,不会退化成单向链表,但是由于一个节点上只有一个值,两个分叉,如果数据量非常大的话,树的高度会很高
			一个磁盘块中所存放的内容过少
			进行查找的时候,可能要读取很多个磁盘块,造成IO次数过多
	d)BTREE
		一颗树,既然纵向上不能太高,所以只能在横向上来做文章了。BTree这种结构一个节点上可以存放多个索引元素,这样树的分叉会变多,最终树的高度就会降低。肯定会减少磁盘IO次数。
		BTREE有个特点是数据也在节点上。
	5)B+TREE
		B+TREE是BTREE数据结构的变种,为什么MySQL要选择它。它的主要特点是,所有数据都是保存在叶子节点,非叶子节点只保存索引的key和指针
		,而且叶子节点的会通过双向指针进行相连,有什么好处?
		①如果一个磁盘块大小固定的情况下,非叶子节点不保存数据,就可以保存更多的key,保存了更多的key,树的分叉是不是就更多
		 这样可以进一步降低树的高度
		②查询效率更为稳定,因为查询任何数据是不是都要找到叶子节点那一层,层级是一样的。
		③由于有指针双向相连,可以便于范围查询
	
InnoDB和MyISAM存储数据和索引上的区别
	innodb是将数据和索引存储在.ibd文件中的
	myisam是将索引存储在.myi文件中,将数据存储在.myd文件中
		先去myi文件中找到数据的磁盘地址,再去myd文件中根据地址直接获取数据。

存储过程
创建语法:
	-- 修改分隔符为$ (由于存储过程中的代码是一个整体,所以不希望;是分隔符)
	DELIMITER $

	-- 标准语法
	CREATE PROCEDURE 存储过程名称([参数列表])
	BEGIN               -- 相当于java中的{
		SQL 语句列表;   -- 相当于java中的方法体
	END$                -- 相当于java中的}
 
	-- 修改分隔符为分号
	DELIMITER ;
调用存储过程
	CALL 存储过程名称([实际参数列表]);
存储过程的查询
	查看指定数据库中所有的存储过程
		SELECT * FROM mysql.proc WHERE db='数据库名称';
	查看mysql服务器中所有的存储过程
		SHOW PROCEDURE STATUS;
存储过程的删除
	drop procedure [if exists] 存储过程名
	
存储过程中的变量
	①声明变量并赋初始值
		declare 变量名 数据类型 default 默认值
	②声明变量不赋初始值
		declare 变量名 数据类型
	③手动给变量赋值
		set 变量名=值
	④将查询结果赋值给变量
		select 字段名 into 变量名 from 表名...
	注意:变量的赋值必须在所有变量声明完成之后
存储过程中的if条件判断
	if 条件表达式 then
		sql语句
	[elseif 条件表达式 then
		sql语句
	else
		sql语句]
	end if;
参数
	声明参数:
		输入参数
			IN 参数名 数据类型
		输出参数
			OUT 参数名 数据类型
	调用存储过程时传递参数
		输入参数
			1. 写死一个值
			2. 通过查询语句查询一个值
		输出参数  
			@参数名
			@参数名本质是一个会话变量,所谓的用户变量就是在整个会话中都可以使用。
存储过程中的while循环
	while 条件表达式 do
		sql语句;
	end while;
存储函数

​ 创建语法:
​ – 修改分隔符为$ (由于存储过程中的代码是一个整体,所以不希望;是分隔符)
​ DELIMITER $
​ create function 函数名()
​ returns 返回值的类型
​ begin
​ 函数体
​ return 返回值;
​ end
​ – 修改分隔符为分号
​ DELIMITER ;
​ 调用语法
​ select 函数名();
触发器
​ 概念:
​ 可以在 insert、update、delete 之前或之后触发并执行触发器中定义的 SQL 语句
​ 分类:
​ insert型触发器
​ update型触发器
​ delete型触发器
​ 创建语法:
​ DELIMITER $
​ CREATE TRIGGER 触发器名称
​ BEFORE|AFTER INSERT|UPDATE|DELETE
​ ON 表名
​ FOR EACH ROW
​ BEGIN
​ 触发器要执行的功能;
​ END$
​ DELIMITER ;
​ 查看触发器
​ show triggers;
​ 删除触发器
​ drop trigger 触发器名称;

事务
​ 概念: 一个包含一条或者多条sql语句的执行单元,要么同时成功,要么同时失败

三个操作:
	1. 开启事务
		start transaction;
	2. 提交事务
		commit;
	3. 回滚事务
		rollback;
事务的提交方式:
	在mysql中,如果没有手动开启事务,事务默认是自动提交的
		select @@autocommit;
	查看和修改提交机制
		SELECT @@autocommit;
		SHOW VARIABLES LIKE '%autocommit%'

		SET @@autocommit = 1;
		
事务的四大特性
	原子性
		强调的是事务的不可分割
	一致性
		事务的执行前后,由一个一致性状态转移到另一个一致性状态
	隔离性
		强调的是一个事务的执行不应该受到其它事务的干扰
	持久性
		强调的是事务一旦提交或者回滚,对数据库中的数据的影响是持久的
可能产生的问题
	脏读
		一个事务读取到了另一个事务还未提交的数据
	不可重复读
		在一个事务中读取到了另一个事务已经提交的修改的数据,造成在一次事务中多次查询结果不一致
	虚读/幻读
		没有读取到另一个事务已经提交的insert的数据
隔离级别
	read uncommitted
		读未提交
	read committed
		读已提交
	repeatable read   (mysql)
		可重复读
	serializeable
		串行化
	隔离级别从上到下安全性越来越高,但是效率越来越低
	
	查询隔离级别
		select @@tx_isolation
	设置隔离级别
		设置 全局|会话 事务 隔离  级别  ...
		
		set global|session transaction isolation level 
java代码管理事务的代码思路:
	try{
		// 1. 开启事务
		// 2. 执行sql语句
		// 3. 提交事务
	}catch(Exception e){
		// 4. 回滚事务
	}	




























  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle 中的外键约束用于维护表之间的引用完整性,它定义了一个表中的一列或多列与另一个表中的一列或多列之间的关系。这个关系可以是单向的,也可以是双向的。 在 Oracle 中,创建外键约束需要满足以下条件: 1. 外键列和所引用的主键列的数据类型必须相同。 2. 外键列和所引用的主键列的长度必须相同。 3. 外键列和所引用的主键列必须都已经定义为 NOT NULL。 4. 外键列必须是索引列。 创建外键约束的语法如下: ``` ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 FOREIGN KEY (外键列名称) REFERENCES 主键表名称 (主键列名称); ``` 其中,表名称是指需要添加外键约束的表名,约束名称是自定义的外键约束名称,外键列名称是需要添加外键约束的列名,主键表名称是被引用的表名,主键列名称是被引用表的主键列名。 例如,创建一个名为 "orders" 的表,它有一个外键列 "customer_id",引用了 "customers" 表的 "id" 列: ``` ALTER TABLE orders ADD CONSTRAINT orders_fk1 FOREIGN KEY (customer_id) REFERENCES customers (id); ``` ### 回答2: Oracle 外键约束是一种用于确保数据完整性的约束。它通过在列级别上定义关联关系,限制了一个表中的外键与另一个表中的主键或唯一键之间的关联关系。 外键约束可以用来保证数据的一致性和完整性。当我们在一个表中创建外键约束,它会将指定列与另一个表的主键或唯一键进行关联。这样,在插入、更新或删除数据,系统会自动检查外键约束,确保数据操作不会破坏关联关系。 外键约束可以有以下几个特点: 1. 外键关系必须在参照表上存在主键或唯一键约束。 2. 外键列的数据类型必须与参照列的数据类型匹配。 3. 外键列的值必须是参照表的主键或唯一键列中存在的值。 4. 当参照表的主键或唯一键更新或删除,涉及到外键的操作也会受到影响。 外键约束的作用有以下几点: 1. 数据完整性:外键约束可以保证在关联表之间维护数据的一致性,防止无效或不合法数据的插入或更新。 2. 级联操作:定义级联操作可以在参照表上进行更新或删除操作更新或删除关联的外键表中的数据,避免了手动处理关联数据的复杂性。 3. 查询优化:外键约束可以帮助优化查询,提高数据检索性能。 4. 数据模型的清晰性:通过外键约束,可以更清晰地定义表之间的关联关系,方便他人理解数据模型。 总之,Oracle 外键约束是一种强制性的关联关系,可以保证数据的一致性和完整性,提高数据库查询性能,并且使数据模型更加清晰易懂。 ### 回答3: Oracle外键约束是一种用来保持数据完整性的约束。它定义了两个表之间的关系,并防止数据库中的无效数据。外键约束在两个表之间创建引用,一个表中的一个列是另一个表的主键或唯一键。 通过外键约束,我们可以确保在从表中的外键列只包含在主表中已经存在的值。当我们向从表中插入或更新数据,如果外键约束被违反,Oracle将抛出一个错误,阻止操作继续进行。 外键约束可以执行以下操作: 1. 防止删除或更新主表中的行,如果在从表中的外键列中仍然存在引用。这可以防止出现孤儿记录。 2. 防止插入或更新从表中的行,如果在主表中没有对应的主键或唯一键值。这可以防止出现无效的引用。 通过使用外键约束,我们可以确保数据库中的数据完整性和一致性。它可以减少数据错误和无效引用的可能性,并确保数据库中的相关数据保持一致。 外键约束可以在创建表定义,也可以在后期通过ALTER TABLE语句添加。我们可以选择指定外键约束的名称,以及在违反约束的动作,如RESTRICT、CASCADE或SET NULL。 总而言之,Oracle外键约束可以确保在表之间保持有效关系,防止无效引用和孤儿记录,并维护数据库的数据完整性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值