Oracle 数据库学习笔记 (二)

世界杯开始 2025-09-11 07:45:14

1.5 如何删除表空间?

表空间是一个文件,真真实实存存放在物理硬盘中,如果我们不需要该表空间的时候,就可以对其进行删除处理。但是我们不能直接删除表空间(.dbf)文件,这样会报错。因此我们需要先使用命令行删除在 数据库中的表空间,然后才可以在物理磁盘中删除表空间文件

因此正确的删除表空间的步骤如下:

使用命令行删除表空间

然后才可以删除物理磁盘上的表空间

drop tablespace my_mobile

drop 是个很万能的语句,它还能够直接清空表字段中的数据

二、表的相关操作

=======================================================================

2.1 创建表

语法

create table .表名称(

字段名称1 字段类型 [default 默认值],

字段名称2 字段类型 [default 默认值],

字段名称n 字段类型 [default 默认值]

)

eg:创建一个学生类型的信息表

create table tb_student(

stuId number, – 学生的ID

stuName nvarchar(8), – 学生的姓名

stuIdCard number(18,0), – 学生身份证

stuGender nvarchar2(2) default ‘男’, – 学生性别,默认为 0

stuAge number(3), – 学生的年龄

)

2.2 插入数据 insert

语法:

形式一

insert into 表名(参数1,参数2,参数3…参数n) values (参数1对应的值,参数2对应的值,…,参数n对应的值);

形式二

insert into 表名 values(参数1对应的值,参数2对应的值…,参数n对应的值)

两者的区别如下:

前者是指定类型插入,可以选择性的插入指定的数据

后者必须插入表所有属性的值,也就是一个都不能漏掉

eg:以上面的学生表为例

insert into tb_student (stuId,stuIdCard,stuGender,stuAge,tid) values(20171111034,320101197905156354,‘男’,19,2)

2.3 表创建(约束)

在数据库的设计中,约束是必不可少的支持,使用约束可以更好的保证数据库中数据的完整性,约束的作用是定义规则

举几个例子:

人的身份证有 18 位,这个不加约束的话,有的人乱填,就会出现很多问题

一个人的性别分为 ‘男’,‘女’,‘未知’,这也不能乱填

每当学校新生入学的时候,总是会必不可免的出现有人同名的情况,但是他们的身份证不一样,所以可以另外添加一个学号属性,这样这个学生就是唯一的啦

还有人的年龄一般不会超过 150岁,所以插入数据的时候也需要加一个判断,年龄是否超出呢?是不是

约束的分类:

| 约束分类 | 约束功能 |

| — | — |

| 主键约束 | 主键是唯一的表示,本身不能为空(比如在学校你想确认一个同学,可以通过他的学号定位到他) |

| 唯一约束 | 在一个表中一次只允许建立一个主键约束,而其他列不希望出现重复值的情况下,可以使用唯一约束。一张表中的唯一约束可以有多个,并且允许有空值 ,空值只能有一个 |

| 检查约束 | 检查一列的内容是否合格 ,例如:年龄输入加一个限制,在0 ~ 150之间 ,性别,只能是男或者女 |

| 非空约束 | 字段里面的内容不能为空 |

| 外键约束 | 在两张表中进行约束操作,这就要区别一下父表和子表的区别啦,父表的 ID 可以对 子表的 ID 具有约束租用 |

2.3.1 主键约束

关键字:primary key

主键约束可以确认每一行数据的唯一性

eg:还是以上面创建学生表为例

create table tb_student(

stuId number primary key, – 学生的ID,学生的 ID 作为主键,而且不为空

stuName nvarchar(8), – 学生的姓名

stuIdCard number(18,0), – 学生身份证

stuGender nvarchar2(2) default ‘男’, – 学生性别,默认为 0

stuAge number(3), – 学生的年龄

– 另一种创建 主键的方式

– constraint tb_student_stuId_pk primary key(stuId) pk 是我另外给主键创建的一个名称

)

这个在插入数据的时候,才会出来问题,如果插入两个数据的 ID 相同就会报错

使用了主键约束,就相当于使用了非空约束

在修改表的时候增加主键约束

语法:add coinstraint constraint_name primary key(column_name1 .....);

– 给学生 id 加上主键

alter table tb_student add contraint pk_id primary key(stuId);

更改约束名称

语法:rename constraint old_name to new_name

alter table tb_student rename pk_id to new_pk_id;

删除主键约束

约束的禁用

语法:disable | enable constraint constraint_name

alter table tb_student disable constraint new_pk_id; – 约束禁用

alter table drop constraint new_pk_id; – 删除主键

alter table drop primary key; – 删除主键约束

2.3.2 非空约束

关键字:not null

使用非空约束,表示一个字段的内容不允许为空,即:插入数据的时候必须插入内容

创建表的时候增加约束

eg:只用在每个列属性后面加上 not null 就可以啦

create table tb_student(

stuId number primary key, – 学生的ID,学生的 ID 作为主键,而且不为空

stuName nvarchar(8) not null, – 学生的姓名

stuIdCard number(18,0) not null, – 学生身份证

stuGender nvarchar2(2) default ‘男’, – 学生性别,默认为 0

stuAge number(3) not null – 学生的年龄

)

修改表时增加约束

语法:alter table table_name modify column_name dataType NOT null;

alter table tb_student modify stuName nvarchar(8) not null;

修改表时去掉非空约束

语法:alter table table_name modify column_name dataType null;

2.3.3 唯一约束

关键字:unique

表示一个字段中的内容是唯一的,其他列不允许重复

eg:使用了这个关键字就要好好注意一下

create table tb_student(

stuId number primary key, – 学生的ID,学生的 ID 作为主键,而且不为空

stuName nvarchar(8) not null, – 学生的姓名

stuIdCard number(18,0) unique not null, – 学生身份证

stuGender nvarchar2(2) default ‘男’, – 学生性别,默认为 0

stuAge number(3) not null – 学生的年龄

)

另一种方式设置 唯一约束

create table tb_student(

stuId number primary key, – 学生的ID,学生的 ID 作为主键,而且不为空

stuName nvarchar(8) not null, – 学生的姓名

stuIdCard number(18,0) not null, – 学生身份证

stuGender nvarchar2(2) default ‘男’, – 学生性别,默认为 0

stuAge number(3) not null – 学生的年龄

– 给唯一约束 创建别名

– 格式 constraint 表名_列名_uk unique (列1,列2),

– constaint tb_student_stuName_uk unique(stuName)

CONSTRAINT stu_Id_uk UNIQUE(stuIdCard ) – 唯一约束的另一种方式

)

修改表的时候添加唯一约束

alter table tb_student add constraint stu_Id_uq unique(stuIdCard);

删除唯一约束

alter table xxx disable | enable constraint xxx; – 暂时禁用

alter table xxx drop constraint xxx; – 永久删除

2.3.4 检查约束

关键字:check

使用检查约束来判断一个列中插入的内容是否合法,例如:年龄的取值范围,性别的取值范围

注意:

可以使用 where(条件判断) 表达式后面就可以使用 check

eg:性别 和 年龄的检查约束

create table tb_student(

stuId number primary key, – 学生的ID,学生的 ID 作为主键,而且不为空

stuName nvarchar(8) not null, – 学生的姓名

stuIdCard number(18,0) unique not null, – 学生身份证

— test

stuGender nvarchar2(2) default ‘男’ check(stuGender in (‘男’,‘女’,‘不详’)), – 学生性别,默认为 0

stuAge number(3) not null check (stuAge between 0 and 150)-- 学生的年龄

– 检查约束另外起名

– constraint tb_student_stuAge_ck check (stuAge between 0 and 150)

– constraint tb_student_stuGender_ck check (stuGender in (‘男’,‘女’,‘不详’))

)

删除检查约束

alter table xxx disable | enable constraint xxx; – 暂时禁用

alter table xxx drop constraint xxx; – 永久删除

2.3.5 外键约束

创建表时设置外键约束

在修改表时添加外键约束

删除外键约束

关键字:

foreign key

REFERENCES

主-外键约束是针对两张表的约束

有一张表 TA ,且表有主键,另外一张表中的某一列的数据完全取自于 TA,此时就 TB 表中该列为外键列,添加主外约束来限制它 (TB 外键列上添加)

是不是有点绕口,我换个说法给大家

有两张表 A和B,A 表中的主键记为 AId,表B 的主键记为 BID,表 B 的 BID 加一个 外键,引入 AId,也就是说,以后 Aid 中的所有值,BID 才可以使用

eg:

先创建一个 表A, person 类型

CREATE TABLE person (

pid VARCHAR2(18),

name VARCHAR2(200)NOT NULL,

age NUMBER(3)NOT NULL,

birthday DATE,

sex VARCHAR2(2)DEFAULT’男”,

CONSTRAINT person_pid_pk PRIMARY KEY(pid),

CONSTRAINT person_name_uk UNIQUE(name),

CONSTRAINT person_age_ck CHECK(age BETWEEN O AND 150),

CONSTRAINT person_sex_ck CHECK(sex IN("男,’女,“中))

);

创建一个表 B

CREATE TABLE book (

bid NUMBER PRIMARY KEY NOT NULL,

bname VARCHAR(30),

bprice NUMBER(5,2),

pid VARCHAR2(18) REFERENCES person(pid) – 通过 references 引入外键,这里的外键是主表

– constraint person_book_pid_fk foreign key(pid) references person(pid)

);

这样就完成了主外键的操作,但是有几点需要注意

主表先创建,然后插入数据,再创建附表(主外键)才可以创建

如过要删除主表中的某一条数据,如果此列的数据被附表的主外键引用,则不能删除

希望一个表中数据在删除时,可以自动删除其对应的子表记录,则可以使用级联删除操作

总结:

CREATE TABLE person(

pid VARCHAR2(18),

name VARCHAR2(200)NOT NULL,

age NUMBER(3)NOT NULL,

birthday DATE,

sex VARCHAR2(2)DEFAULT’男,

classid CONSTRAINT person_pid_pk PRIMARY KEY(pid),

CONSTRAINT person_name_uk UNIQUE(name),

CONSTRAINT person_age_Ck CHECK(age BETWEEN O AND 150),

CONSTRAINT person_sex_ck CHECK(sex IN‘男’,女,”中”))

);

CREATE TABLE book

bid NUMBER PRIMARY KEY NOT NULL,

bname VARCHAR(30),bprice NUMBER(5,2),

pid VARCHAR2(18)CONSTRAINT person_book_pid_fk FOREIGN KE(pid)REFERENCES person(pid)

删除外键约束

alter table xxx disable | enable constraint xxx; – 暂时禁用

alter table xxx drop constraint xxx; – 永久删除

2.3.6 总结

约束总共分为五类,分别是:

主键约束 primary key

非空约束 not null

检查约束 check

外键约束 foreign key

唯一约束 unique

在使用的时候,如果表已经创建好,我们需要额外添加约束关系的话,可以使用如下方法

增加约束

alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)

删除约束

alter table 表名 disable | enable constraint 约束类型;

alter table 表名 drop constraint 约束类型; – 永久删除

2.4 序列

2.4.1 创建序列

序列是一个计数器,它并不会与特定的表相关联。通过创建 Oracle 序列可以实现表的主键自增。序列的用途一般用来填充主键和计数

特性

自动填充唯一的数值

共享对象

主要用于提供主键值

代替应用代码

将序列装入内存可以提高访问效率

语法:

create sequence 序列名

increment by n, – 步长,每次增加的数据

start with n, – 从 n 开始计数

maxvalue n| nomaxvalue, – 最大值、无最大值

minvalue n| nominvalue, – 最小值、无最小值

cycle | nocycle – 循环序列,不循环

cache n | nocache; – 缓冲池,将数据加载到内存,提高性能,但是容易损失数据

创建序列:

从 100 开始,每次增加10个步长,最大值 1w,不循环,不进入缓冲池

create sequence dept_deptid_seq

increment by 10

start width 100

maxvalue 10000

nocache

nocycle

2.4.2 查询序列

nextval 和 currval 伪例

nextval 返回序列中下一个有效的值,任何用户都可以引用

currval 中存放序列的当前值

nextval 应在 currval 之前指定,二者应同时有效

select 序列名.currval from dual --dual 是虚拟表,不存在的表

2.4.3 修改序列的值

使用 alert 关键字进行修改

修改序列的增量,最大值,最小值,循环选项,或是否装入内存(不能修改序列的初始值)

alert sequence 表名

increment by 20

maxvalue 99999

nocache

nocycle

修改限制:

必须是序列的拥有者或对序列有 alert 权限

只有将来的序列值会被改变

改变序列的初始值只能通过删除序列之后重建序列的方法实现

2.4.4 序列问题

将序列值装入内存可提高访问效率

序列会在下面的情况出现裂缝

回滚

系统异常

多个表同时使用同一个序列

如果不将序列的值装入内存(nocache),可使用表 user_sequences 查看当前的有效值

2.4.5 删除序列

drop sequence 表名;

sequence dropped 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

总结

以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!

下面给大家分享下我的面试大全资料

第一份是我的后端JAVA面试大全

后端JAVA面试大全

第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

第三份是Spring全家桶资料

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理 《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! (img-3FSHpr7d-1713346736785)]

[外链图片转存中…(img-bahF8aZo-1713346736785)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

总结

以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!

下面给大家分享下我的面试大全资料

第一份是我的后端JAVA面试大全

[外链图片转存中…(img-HotMtXJ5-1713346736786)]

后端JAVA面试大全

第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理

[外链图片转存中…(img-IbvAyPPD-1713346736786)]

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

第三份是Spring全家桶资料

[外链图片转存中…(img-1kgUluLY-1713346736786)]

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理 《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!