Orale 创建表、修改表结构、约束、索引、数据库设计三范式

创建表

CREATE TABLE [sheme.]table
(column datatype [default expr] , …
);

例子:建立一张存储学生信息的表

create table student
(
stu_id number(10) primary key,
name varchar2(20) not null,
age number(3) check(age>0 and age<126), 
enrolldate date,
grade varchar2(10) default 1,
class varchar2(10),
email varchar2(50) unique
);

--插入数据
insert into student values(20200101,'zhangsan',20,to_date('2020-01-01','YYYY-MM-DD'),'2','1','[email protected]');

修改表结构

添加列:
alter table student add address varchar2(100);

删除列:
alter table student drop column address;

修改列属性:
alter table student modify(email varchar2(100));

重新命名表:
rename student to stu;

删除表:
drop table stu;

约束

Oracle 支持的约束:

  1. NOT NULL 非空约束
  2. UNIQUE KEY 唯一键,唯一键的列一般被用作索引列。
  3. PRIMARY KEY 主键,非空且唯一,任何一张表最好有主键,用唯一标识标识一行记录。
  4. FOREIGN KEY 外键,当多个表之间有关联关系(一个表的某个列的值依赖于另一张表的某个值)的时候,需要使用外键。
    比如 emp 表中每个员工的部门编号与部门表的部门编号有关联关系,无法插入 部门编号为 部门表中不存在的编号的员工记录。
  5. CHECK 自定义检查
外键约束

外键是表中的一个列,其值必须在另一表的主键或者唯一键中列出
作为主键的表称为“主表”,作为外键的关系称为“依赖表”
外键参照的是主表的主键或者唯一键

对于主表的删除和修改主键值的操作,会对依赖关系产生影响,以删除为例:
当要删除主表的某个记录(即删除一个主键值,那么对依赖的影响可采取下列 3 种做法:

1.RESTRICT 方式:只有当依赖表中没有一个外键值与要删除的主表中主键值相对应时,才可执行删除操作。

2.CASCADE 方式:将依赖表中所有外键值与主表中要删除的主键值相对应的记录一起删除

3.SET NULL 方式:将依赖表中所有与主表中被删除的主键值相对应的外键值设为空值

FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
[ON DELETE [CASCADE|SET NULL]]

create table student
(
stu_id number(10) primary key,
name varchar2(20) not null,
age number(3) check(age>0 and age<126), 
enrolldate date,
grade varchar2(10) default 1,
class varchar2(10),
email varchar2(50) unique,
FOREIGH KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
);

约束添加和撤销

–可以在建表时添加,也可以后来添加
alter table student add constraint fk_001 foreign key(deptno) references dept(deptno);
–撤销约束
alter table student drop constraint fk_001 foreign key(deptno) references dept(deptno);

索引

索引的作用:在数据库中用来加速对表的查询 通过使用快速路径访问方法,快速定位数据 减少了磁盘的 I/O

索引的创建有两种情况

  1. 自动 : 当在表上定义一个 PRIMARY KEY 或者 UNIQUE 约束条件时 ,Oracle 数据库自动创建一个对应的唯一索引
  2. 手动 : 用户可以创建索引以加速查询

开发中使用索引的要点:

  • 索引改善检索操作的性能, 但降低数据插入、修改和删除的性能 。在执行这些操作时, DBMS 必须动态地更新索引。
  • 索引数据可能要占用大量的存储空间。
  • 并非所有的数据都适合于索引。唯一性不好的数据(如省)从索引的到的好处不比具有更多可能值的数据(如姓名)从索引得到的好处多。
  • 索引用于数据过滤和数据排序。如果你经常以某种特定的顺序排序数据,则该数据可能是索引的备选。
  • 可以在索引中定义多个列(如省加城市),这样的索引只在以省加城市的顺序排序时有用。如果想按城市排序,则这种索引没有用处。
--创建索引
create index i_ename on emp(ename);
--删除索引
drop index i_ename;

数据库设计三范式

第一范式:列不可分

第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到 地址 这个属性,本来直接将 地址 属性设计成一个数据
库表的字段就行。
但是如果系统经常会访问 地址 属性中的 城市 部分,那么就非要将 地址 这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。

第二范式:列必须直接依赖主键

在这里插入图片描述
该表存在多对对关系,只有一个主键是不够的,这张表的主键是学生和老师编号的组合。
产生了部分依赖,会产生冗余数据,需要分解表。
可以分为以下三张表:
在这里插入图片描述
在这里插入图片描述
数据不存在部分依赖的情况,即满足了第二范式。

第三范式:传递依赖:表里面的列不能出现其它表的非主键字段

在这里插入图片描述

班级名称和班级信息这一组值没有必要的重复出现,这些值并不直接依赖于学号(主键),而是依赖于班级号,也就是时说表中出现了 传递依赖。
解决这个问题的办法是把这些和学号(主键)没有直接联系的信息记录的新的表里面,即班级表。
在这里插入图片描述

发布了40 篇原创文章 · 获赞 1 · 访问量 1087

猜你喜欢

转载自blog.csdn.net/weixin_44495162/article/details/103818355