Oracle实战练习(续三)

   #数据库常用对象
#1. 建立表
create table stu(
 id number(6),
 name varchar2(20),
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);

#2.删除表
drop table stu;

#3.五个约束条件
#(1)非空约束(not null)  (这里name not null)
create table stu(
 id number(6),
 name varchar2(20) not null,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);
#可以定义字段级约束,也可以定义表级约束
create table stu(
 id number(6),
 name varchar2(20) constraint stu_name_nn not null,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);
name constraint stu_name_nn not null
如果在name字段中插入一个null值,则会出现如下错误:无法将 NULL 插入 ("DYS"."STU"."NAME");

#(2)唯一约束(unique)
create table stu(
 id number(6) unique,
 name varchar2(20) constraint stu_name_nn not null,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);
如果在id字段中插入重复的值,则会显示如下错误:违反唯一约束条件
字段级约束,缺点是如果设两个字段为约束条件,则不能实现目的
create table stu(
 id number(6) ,
 name varchar2(20) ,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50),
 constraint uq_stu_unique unique(id, email)
);
constraint uq_stu_unique unique(id, email), 这样设的话可以把两个字段联合在一起.
唯一约束中的表级约束
constraint stu_name_email_unique unique(name, email);
#(3)主键约束(primary key)
主键(primary key),可以唯一标识整条记录,非空且唯一.
create table stu(
 id number(6) primary key,
 name varchar2(20) ,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
);
#(4)外键约束(foreign key)
create table class (
 id number(4) primary key,
 name varchar2(20) not null
);
create table stu(
 id number(6) primary key,
 name varchar2(20) ,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4) references class(id),
 email varchar2(50)
);
class number(4) references class(id) 这条是表stu的外键参照表class的主键
如果向表stu插入数据的时候,insert into stu(id,name,class, email)values(1,'a',1000,'a');
则会出现如下错误:违反完整约束条件 (DYS.SYS_C005763) - 未找到父项关键字
表级约束:
constraint stu_class_fk foreign key(class) references class(id),
create table stu(
 id number(6) primary key,
 name varchar2(20) ,
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4) ,
 email varchar2(50),
 constraint stu_class_fk foreign key(class) references class(id)
);
先向表class中插入数据: insert into class values(1000,'LI');
再向表stu中插入数据:   insert into stu(id,name,class, email) values(1,'a',1000,'a');
被参考的字段必须是主键
#(5)check约束
delete from class where id = 1000;   #这个值被参考了,(违反完整约束条件)

#4.修改表结构
alter table stu add(addr varchar2(100)); #增加字段
alter table stu drop(addr);
alter table stu add(addr varchar2(100));
alter table stu modify(addr varchar2(150)); #修改字段
注意:修改后的精度必须能允许先前的精度, 比如number(50)--> number(25), 可能会截取了一些数据.
增加或者删除约束条件:
delete from class;  #不能删,因为违反完整约束条件 (DYS.STU_CLASS_FK),有外键约束
如果把约束条件删除了后可以删除表中的数据
alter table stu drop constraint stu_class_fk;
然后再删除表中的数据
delete from class; #这时就可以删除了


#5.数据字典
 desc user_tables;
 #查看有什么表
 select table_name from user_tables;
 #查看有哪些视图
 select view_name from user_views;
 #查看有哪些约束条件
 select constraint_name from user_constraints;
 #显示约束条件的结构
 desc user_constraints;
#数据字典存在一个表中,这个表称为dictionary
 #显示数据字典表中的结构
 desc dictionary;
 #查看数据字典中的表
 select table_name from dictionary;
 select table_name from dictionary where table_name like 'USER%'order by tab
le_name;

#6.索引
  desc stu;
 #创建索引
  create index idx_stu_email on stu(email);
 #删除索引
  drop index idx_stu_email;
 #从数据字典中查看有哪些索引
  select index_name from user_indexes;
 #建立索引后,插入数据慢了,因既要在表中插入数据,又要在索引中插入, 但是读数据却比较快. 索引也会占用空间,不要轻易建立.
 
#7.视图
  #视图, 就是子查询
  #建立索引
   create view v$_stu as select id, name, age from stu;
  #查看索引
   desc v$_stu;
  #查看数据字典中的视图
  select view_name from user_views;
  desc v$dept_avg_sal_info;
  #视图是可以更新数据的.一般不建议在视图中更新数据.
 
#8.序列
  #序列是oracle数据库中独特的,产生唯一的不间断的序列, 一般用作主键
  #创建表
   create table article(id number, title varchar2(1024), content long);
  #创建索引
   create sequence seq; #此时会出现权限不足的现象
  #连接到数据库管理员
   conn sys/dys as sysdba;
  #授权给用户创建序列的权限
   grant create sequence to dys;
  #然后再创建序列
   create sequence seq;
 #序列在内部已经作好了线程同步了,不会出现数据不一致的现象
  #查看序列的下一个值
   select seq.nextval from dual;   
  #向表article中插入数据
   insert into article values(seq.nextval, 'a', 'b');
  #查看表article中的数据
   select * from article;
  #删除序列
   drop sequence seq;
  #一个序列对应于一个字段
 
 #9.数据库的三范式
  #数据库设计的三范式,是要追求不存在冗余字段, 同样的数据不存在第二遍
  #范式:是数据库设计的规则
 #第一范式的第一要求是要有主键,第二要求是列不可分,即在列上不能重复. 比如出生年月和年龄, 这是一种重复
 #第二范式:当一张表中有多个字段组合作为主键时,非主键的字段不能够依赖于部分主键.
 #第三范式:存在传递依赖
 #在设计数据库时只要做到三范式就可以了.
 
 
 
     

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值