Oracle 数据库学习笔记 (二)
约束总共分为五类,分别是:主键约束非空约束not null检查约束check外键约束唯一约束unique在使用的时候,如果表已经创建好,我们需要额外添加约束关系的话,可以使用如下方法增加约束alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)删除约束alter table 表名 disable | enable constraint 约束类型;alte
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
2.5 复制
- 复制一个一模一样的数据
select * from emp1 as select * from emp
赋值结构不复制数据
select * from emp1 as select * from emp where 1 == 2
=====================================================================
3.1 创建一个学生表student 学生ID (主键) 学生身份证(唯一不允许为空) 学生的性别默认男(男,女) 学生的年龄(10-30) 老师ID(外键)
create table tb_student(
stuId number primary key, – 主键,内容默认,且不为空
stuIdCard number(18,0) unique not null, – 唯一 不为空
stuGender nvarchar2(2) default ‘男’,
stuAge number(3) not null check(stuAge between 10 and 30),
pid number(10) REFERENCES tb_teacher(tid), – 主外键
constraint tb_student_stuGender_ck check(stuGender in(‘男’,‘女’))
)
3.2 创建一个老师表teacher 老师ID(主键) 老师身份证(唯一不允许为空) 老师的性别默认女(男,女) 老师的年龄(20-70)
create table tb_teacher(
tid number(10) primary key, – 主键
tIdCard number(18,0) unique not null, – 身份唯一不为空
tSex nvarchar2(2) default ‘女’,
tage number(3) check(tage between 20 and 70),
constraint tb_teacher_tSex_ck check(tSex in(‘男’,‘女’))
)
3.3 插入学生的信息5条,插入老师的信息3条,
insert into tb_student (stuId,stuIdCard,stuGender,stuAge,tid) values(20171111034,320101197905156354,‘男’,19,2)
insert into tb_student (stuId,stuIdCard,stuGender,stuAge,tid) values(20171111024,120101197905156334,‘女’,19,3)
insert into tb_student (stuId,stuIdCard,stuGender,stuAge,tid) values(20171111014,420201198905156354,‘男’,20,4)
– 教师数据中没有对应的 tid 值,所以这里是无法插入进去的
insert into tb_student (stuId,stuIdCard,stuGender,stuAge,tid) values(20171111004,510101197905157354,‘女’,21,8)
insert into tb_student (stuId,stuIdCard,stuGender,stuAge,tid) values(20171111044,320101192605156354,‘男’,19,9)
insert into tb_teacher (tid,tIdCard,tSex,tage) values(2,420201198905156354,‘女’,27)
insert into tb_teacher (tid,tIdCard,tSex,tage) values(3,420201198905156355,‘女’,37)
insert into tb_teacher (tid,tIdCard,tSex,tage) values(4,420201198905156356,‘男’,26)
– 检验
select * from tb_student
select * from tb_teacher
3.4 删除老师和学生的信息
3.4.1 删除学生的所有信息
drop table tb_student
3.4.2 删除老师的所有信息
drop table tb_teacher
3.5 修改1和2的约束为自定义的约束名称
– 学生 id 的约束
– primary 约束
CONSTRAINT tb_student_stuId_pk1 PRIMARY KEY(stuId)
– unique 约束
CONSTRAINT tb_student_stuIdCard_uk UNIQUE(stuIdCard) ,
– check
CONSTRAINT tb_student_stuAge_ag CHECK(stuAge BETWEEN 10 AND 30)
constraint tb_student_stuGender_ck check(stuGender in(‘男’,‘女’))
– 老师 id 的约束
– primary
CONSTRAINT tb_teacher_tid_pk2 PRIMARY KEY(tid)
– unique
CONSTRAINT tb_teacher_tIdCard_tk UNIQUE(tIdCard)
– check
CONSTRAINT tb_teacher_tage_ag1 CHECK(tage BETWEEN 20 AND 70)
constraint tb_teacher_tSex_ck check(tSex in(‘男’,‘女’))
3.6 修改级联删除
create table tb_student(
stuId number primary key, – 主键,内容默认,且不为空
stuIdCard number(18,0) unique not null, – 唯一 不为空
stuGender nvarchar2(2) default ‘男’,
stuAge number(3) not null check(stuAge between 10 and 30),
pid number(10) REFERENCES tb_teacher(tid), – 主外键
constraint tb_student_stuGender_ck check(stuGender in(‘男’,‘女’)),
– 级联删除操作
constraint tb_teacher_tb_student_pid fk foreign key(pid) references tb_teacher(tid) on delete cascade
– 设置null 操作
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)