表的创建和管理

创建前提条件:表空间的使用权限和create table的权限

基本的数据存储集合,由行和列组成。表名和列名遵循如下命名规则:

  • 必须以字母开头
  • 必须在 1–30 个字符之间
  • 必须只能包含 A–Z, a–z, 0–9, _, $,#
  • 必须不能和用户定义的其他对象重名
  • 必须不能是Oracle 的保留字
  • Oracle默认存储是都存为大写
  • 数据库名只能是1~8位,datalink可以是128位,和其他一些特殊字符

创建表的数据类型

img

rowid:行地址 ——伪列

查看行地址

1
select rowid, empno, deptno from emp

创建表的语句:

1
2
3
4
create table 表名(列名 类型, ...,列名 类型);

create table tbl(id number, name varchar2(20));
insert into tbl values(01, 'xiaoliu');

在创建表的时候为某一列设置默认值

1
2
3
4
create table tbl(id number, name varchar2(20), hiredate date default sysdate);
//hiredate date default sysdate 如果hiredate为空,默认使用系统日期值

insert into tbl(id, name) values(02, 'xiaohong'); ---若没有插入hiredate的值, 则使用默认值

通过已有的表创建一个表, 相当于表结构的复制

1
create table tbl_bak as select * from tbl where 1=2;

修改表

增加一个列

1
2
3
alter table 表名 add 列名 类型;

alter table tbl add email varchar2(30);

修改列属性

1
2
alter table 表名 modify 列名 要修改的类型;
alter table tbl modify email varchar2(40);

重命名列

1
2
alter table 表名 rename column 旧列名 to 新列名;
alter table tbl rename column email to address;

删除列

1
2
alter table 表名 drop column 列名;
alter table tbl drop column address;

表名的重命名

1
2
rename 旧表名 to 新表名;
rename t1 to t2;

删除表

1
2
3
4
5
drop table 表名;       --删除的表可以闪回
drop table 表名 purge; --purge的作用删除不经过回收站, 删除的表不可以闪回

drop table tbl; --删除的表可以闪回
drop table tbl purge; --purge的作用删除不经过回收站, 删除的表不可以闪回

表的闪回:删除的表恢复回来

1
2
3
4
5
6
7
8
9
10
11
12
实现过程: 
1 create table tbl(id number, name varchar2(20));
2 drop table tbl;
3 select * from tab; ---看tname那一列
4 show recyclebin; ----看ORIGINAL NAME那一列
5 flashback table tbl to before drop;

假如: drop table tbl purge; 则不能闪回了
1 drop table tbl purge;
2 select * from tab;
3 show recyclebin;
4 flashback table tbl to before drop;

表的约束:

表的约束(5种):
○ 检查 (值是否符合预设的规则)
○ 非空 (not null)
○ 唯一 (不能重复)
○ 主键(非空+唯一)
○ 外键 (取值必须在另外一个表中存在)

如不给约束指定起名,那么oracle会自动给约束起名

为测试方便, 新建一个表, 与dept一样, 并添加主键(做就要是为了测试外键)

1
2
create table dept_bak as select * from dept;
alter table dept_bak add constraint pk_dept_bak primary key (DEPTNO);

使用约束的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
create table student(
id number constraint pk_student primary key, ---主键(非空唯一)
name varchar2(30) not null, --非空
email varchar2(30) unique, --唯一
sex varchar2(10) check(sex in ('男','女')), --check约束
sal number check(sal>10000), --check约束
deptno number(2) references dept_bak(deptno) on delete set null --当dept_bak表的数据被删除以后, 该列设置为null
);


REFERENCES: 标示在父表中的列
ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
ON DELETE SET NULL(级联置空): 子表中相应的列置空

给hiredate设置默认值

1
alter table student add hiredate date default sysdate;

1 验证主键: 分两方面验证, 非空和唯一

1
2
3
4
5
先正常插入一条记录: 
insert into student(id, name, email, sex, sal, deptno) values(1000, 'xiaohong', 'helloworld@163.com', '女', '10001', 10);

验证主键唯一性:
insert into student(id, name, email, sex, sal, deptno) values(1000, 'xiaohong', 'helloworld@163.com', '女', '10001', 10);--报错, 1000与刚刚插入成功的重复了

验证主键非空:

1
insert into student(id, name, email, sex, sal, deptno) values(null, 'xiaohong', 'helloworld@163.com', '女', '10001', 10);

2 验证非空: 使用name来进行验证

1
insert into student(id, name, email, sex, sal, deptno) values(1001, null, 'hello@163.com', '女', '10001', 10);

3 验证唯一性: 通过email进行验证

1
insert into student(id, name, email, sex, sal, deptno) values(1001, 'xiaoliu', 'helloworld@163.com', '女', '10001', 10);

4 验证check约束: 使用sex和sal进行验证

1
2
3
4
5
insert into student(id, name, email, sex, sal, deptno) values(1001, 'xiaoliu', 'xiaofang@163.com', '无', '10001', 10);   
--sex违反check条件,sex只能取'男','女'

insert into student(id, name, email, sex, sal, deptno) values(1001, 'xiaoliu', 'xiaoyuan@163.com', '女', 9000, 10);
--sal违反check条件,sal>10000

5 验证外键

1
2
insert into student(id, name, email, sex, sal, deptno) values(1002, 'xiaoliu', 'xiaohua@163.com', '女', '10001', 11);   
---dept表中不存在deptno为11的部门编号
1
2
3
4
a--cascade 级联删除, 主表记录删除的时候, 子表数据跟着删除
b--drop table dept_bak cascade constraints;
c--set null 设置为null, 主表删除的时候,子表该字段设为null
d--默认方式, 主表删除的时候, 如果子表引用了该字段的数据, 不能删除, 先删子表, 后删主表