事物:
事物处理:利用事物保证数据库的完整性(要么全部成功或全部失败)
回滚操作:
- (1)save point aa;
- delete from emp
- rollback to aa;
- (2)save point aa;
- delete from emp where empno=9000;
- save point bb;
- delete from emp;
- rollback to bb;
一旦回退不能再次回退
设置保存点,有资源开销
rollback ; 全部回滚
JAVA程序中控制食物(transation)
(1)数据完整性,使用约束,触发器,应用程序(过程函数)
约束为首选(not null,unique,primary key,foreign key,check)
(1)not null create table user1(id number,name varchar2(32) not null)
(2)unique create table user2(id number,name varchar2(32) unique) name 可以为空
(3)primary key 唯一的标示表行的数据,当定义主键约束后,该列不但不能重复而且不能为空
create table user3(id number primary key,name varchar2(32));
primary key 与unique区别:(1)一个表可以有多个unique,但只能有一个主键(2)unique列的值可以为空,但主键的值不能为空
(3)主键建好以后的列,自动加上一个索引,(4)每张表中只能有一个主键。
单独一个unique不会自动创建一个索引
(4)foreign key 定义主表与从表之间的关系,外键约束要在从表上,主表则必须具有主键约束、unique约束
定义外键约束后,要求外间数据必须在主表的主键列存在或是为null 从表中的列式主表中的主键
- 主表 class
- create table class(id number primary key,
- name varchar2(32));
- 从表 student
- create table students(id number primary key,
- name varchar2(32) not null,
- classid number references class(id));
先建主表后建从表,先删除从表后删除主表
外键:(1)外键指向主键列
(2)外键可以指向unique
(3)从键列和主键列的数据类型相同
(4)建表时,先建主表,再建从表,删除表时,先删除从表,后删除主表
(5)外键列的值必须在主键列中存在
(6)外键列可以为空(null)
- create table employee2(
- emp_id number(4),
- name varchar2(15),
- dept_id number(2),
- constraint pk_employee primary key(emp_id),
- constraint fk_department foreign key(dept_id) references department(dept_id)
- );
两列同时作为主键(定义复合主键)使用表级定义
- create table user9(
- id_user number,
- id_goods number,
- nums number,
- constraint pk_user_goods primary key (id_user,id_goods));
约束:
用于强制行数据必须满足的条件,假定在sal裂伤定义了check约束,并要求sal列的值在1000--2000之间,如果不在1000到2000之间就会提示出错
- create table user4(id number primary key,
- sal number check(sal>=1000 and sal<=2000),
- sex char(2) check (sex in('男','女')));
序列:
需求:在orcal的一张表中,我们希望优劣,假设该列为整数,我们希望当我们添加一条记录的时候,该值能自动增长
- create sequence myseq
- start with 1
- increment by 1
- minvalue 1
- maxvalue 30000
- cycle 表示当序列增加到3000,从新从1再开始 nocycle表示一直累加,不循环
- nocache 表示不缓存,[cache 10] 表示 一次产生10个号,使用缓存提高效率,但可能会跳号
- 例如 第一次分配1000 突然间断电,下次便从1001开始
- create table test10(id number primary key,
- name varchar2(32));
- insert into test1 values(myseq.nextval,'abc');
多用户共享 syetem使用scott序列
- 用system登陆,创建表后insert into test1 values(scott.seq.nextval,'kkk');
- select * from test10;
- id name
- 3 kkkk
- currval 返回当前值
- select scott.myseq_currval from dual;
- nextval 增加sequence值
- insert into temp values(my.seq.nextval,'tomcat','clerk',7566);
使用sequence
(1)不包含子查询,snapshot,view 的select
(2)insert 语句的子查询
(3)insert语句的values中
(4)update的set中 update 表名,列值,序列名.nextval when
- create table user2(id number primary key,
- name varchar2(30));
- inert into user2(id name);
- select my_seq.nextval,ename from emp
在nextval初始化后才能使用currval,一次nextval会增加一次sequence的值
第一次nextval返回的是初始值,随后的nextval会自动增加
,你定义的increment by 的值 然后返回增加后的值
(1) 先建sequence
(2)后查询currval出错(select mysql.currval from dual)
(3)select myseq.nextval from dual;
(4)再查询select myseq.currval from dual;
在mysql/sql server 可以再定义表是直接指定自增长
- SQL
- create table temp1(
- id int primary key identify(1,1),//从一开始,每次增长1
- name varchar(36));
- MYSQL
- create table temp1(
- id int primary key avot_incrment,
- name varchar(36));
- ORCAL
- 索引 :(1)单列索引 create index 索引名 on 表名(列名)
- (2)复合索引 create index 索引名 On 表名(列名1,列名2)
- create table users(name varchar2(30),
- age number);
- create index inx_name on users(name);
(1)在表上建立索引 才有意义
(2)在where字句或是连接条件上经常引用的列上建立索引
(3)索引的层次不要超过4层
索引:(1)系统占用大约为表级1.2倍的存储空间
(2)更新数据时,系统必须要有额外时间来同时对索引进行更新,以维持数据和索引一致性
(3)不恰当的索引花费更大的时间
存储方式:B*树,反向索引,位图索引
索引的个数:单列索引,复合索引
列值的唯一性:唯一索引,非唯一索引
函数索引,全局索引,分区索引
b*-树索引 再重复值很少的裂伤
位图索引在重复值很多,不同值相对固定的列上
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理