ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle学习笔记(4)

oracle学习笔记(4)

原创 Linux操作系统 作者:Deadmonth 时间:2011-07-15 20:15:01 0 删除 编辑
接着(3)后补充一下 约束
<1> primary key 主键(非空且唯一,建表主键必须有)
-----创建主键
     create table student
     (
          id  number(8)  primary key,
          name varchar2(20),
          birthday  date,
          phone  varchar2(20)
      );
 
   select  *  from user_constraints where   table_name='student';
可以看到表student的主键约束名,系统自定义的。
   --显示命名主键约束:
     create table student
     (
          id number(8)  constraint  student_id_pk primary key,
          name varchar2(20),
          birthday date,
         phone varchar2(20)
     );
 
-- 创建主键的另一方法 
create table student
(
id number(8) ,
name varchar2(20),
birthday date,
phone varchar2(20),
constraint student_id_pk  primary key(id)
 
);
 
-- 删除主键(级联删除)
alter  table student  drop  primary key cascade;
 
--联合主键
create table  test
(
   aid number(4),
  bid  number(4),
  constraint test_name_pk   primary key(aid,bid)
);
 
<2> foreign key (表多时不建议使用,也是约束中最烦的......)
子表的字段名不一定相同,但类型一定要相同,eg,都是varchar2(20);
--父表
create table nation
(
   id  number(4)  primary key,
   title  varchar2(20)
);
 
--子表
create table people
(
   name varchar2(20) primary key,
   id number(4)  references nation(id)
);
 
创建外键的方法还有
    --foreign  key (id) references nation (id)
    --constraints people_id_fk  foreign  key (id)  references nation(id)
创建的外键的字段必须另一张表的主键字段。试一试就知道。
 
对于子表和父表的增加数据,删除数据,修改数据都有可能会有限制。
eg ,-----往父表中添加数据与子表中删除数据无影响
      -----往父表中修改或删除的数据不在子表中也无影响
     ------------------------------------------------------------------------------
 
<3> unique key
 
create table  student
(
   id   number(4)  primary key,
   name  varchar2(20)  unique,
   email   varchar2(20),
   constraint   student_email_uk  unique(email)
);
 
 
注:对于有unique的同一字段插入 多个null 值时,无影响.他们之间不作比较
同时,unique的字段,系统会为她加一个唯一的索引
 
<4> check
 
create table worker
(
    id  number(4) primary key,
    name  varchar2(20),
    salary  number(8,2)  check (salary>2000 and  salary < 10000)
);
 
--eg 要求商品的销售时间在08:00~ 20:00
create table sale
(
 sale_id  number(6)  primary key,
 price  number(8,2)  not null check(price>0),
 sale_time  date  check( to_char(sale_time,'hh24:mi') between 
       '08:00' and  '20:00')
);
 
<5> not null 字段级的定义
再写另一种方法
alter  table worker modify name  constraints  worker_name_nn  not null;
 
--------------------------------------------------
 
再就是试图 view
 
create or replace view emp_view
 as
    select e.employee_id, e.last_name
    from  employees  e;
 
select * from emp_view;
 
------------------------------------------------------
 
序列 sequence

create sequence name_seq
[ increment by value ] //步长
[ start with value ] //起始值
[ minvalue value ] //最小值
[ maxvalue value ] //最大值
[ cycle | nocycle ] //是否循环
[ cache value | nocache ] //缓存

--创建序列

create sequence employee_seq;

--因为创建了一个实实在在的数据库对象,因此可以利用视图 user_objects 和 user_sequences 进行查看
select object_name,object_type,status from user_objects where
lower(object_name) = 'employee_seq';

select sequence_name, min_value, max_value, increment_by from user_sequences
where lower(sequence_name) = 'employee_seq';

--对于序列有两个重要的属性

-—currval , nextval

select employee_seq.currval from dual;
--error:因为select employee_seq.currval from dual;用于获得序列employee_seq的当前值。
--可以首先使用 employee_seq.nextval (这是必须的) , 再尝试使用 currval 属性


select employee_seq.nextval from dual;

--eg:
select * from t_employees; 

drop sequence employee_seq;

-------------------------------start with
create sequence employee_seq
start with 7;

insert into t_employees values (employee_seq.nextval,'陆逊' , 0 ,'ACT');

------------------------minvalue ,maxvalue
--minvalue不能大于当前值

alter sequence employee_seq minvalue 1;

alter sequence employee_seq maxvalue 99999;

--or


alter sequence employee_seq nomaxvalue; --最大值修改为无限 nomaxvalue-->maxvalue value;

--------------------------increment by 步长

create sequence test_seq;

--测试步长(1)

select test_seq.nextval from dual;
select test_seq.nextval from dual;

--得到序列的默认步长时 1。

--修改步长
alter sequence test_seq increment by 5;

--测试步长(2)
select test_seq.nextval from dual;

select test_seq.nextval from dual;


------------------------------------cycle

drop sequence test_seq;

create sequence test_seq
start with 5
minvalue 1
maxvalue 30
increment by 1;


--(1)首次获取 test_seq.nextval, value is 5
select test_seq.nextval from dual;

--(2) 在经过多次测试之后,可以获取其最大值30
select test_seq.nextval from dual;

--(3) 此时,将序列test_seq修改为可循环

alter sequence test_seq cycle;

--(4)再次尝试获取nextval属性
select test_seq.nextval from dual;
--(5)此时的nextval 属性的值为1 ,即为序列的最小值


--(补充)要关闭该选项,不允许序列的循环取值,可利用 nocycle 选项;
alter sequence test_seq nocycle;

----------------------------------修改cache (序列缓存)


-- 其实际意义为,每次利用nextval,并非直接操作序列,而是一次性获取多个值的列表到缓存。使用
-- nextval获取的值, 实际是从缓存抓取。抓取的值,依赖于序列的currval 和 步长 increment by .
-- 默认缓存的大小是20,可以通过alter 命令修改缓存大小。

-- 可以通过如下步骤测试cache 的存在

--(1)尝试将序列test_seq 的 increment by 属性修改为 2

alter sequence test_seq increment by 2;

--error :缓存的值必须小于一次循环所能获取的数目。 因为步长为2,最大值是30. 一次循环所能获得的nextval 的数目为15,
--Oracle不能一次抓取20条记录(大于15);

--—(2)现将尝试将序列test_seq 的最大值maxvalue 修改为临界值 39,并再次将步长修改为2,仍然会导致失败。
alter sequence test_seq maxvalue 39;

alter sequence test_seq increment by 2;

---(3)将序列test_seq的最大值修改为40,再次尝试将步长修改为2
alter sequence test_seq maxvalue 40;

alter sequence test_seq increment by 2;

---(4)通过上面的结果可知,序列的cache 的存在会对修改其他选项产生影响。当然,可以通过alter 命令修改cache 的大小,
--以适应具体序列的要求,代码如下所示:

alter sequence test_seq cache 10;

注意:不能将序列的缓存容量设置过大,其原因与修改 increment by 选项的原因相同(太大会影响获取最大值.......)

 
 
 
 
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25436591/viewspace-702345/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-04-02

  • 博文量
    18
  • 访问量
    44926