ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!

标题: sg笔记四
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-25 21:07 
sg笔记四

SQL> rename tx to newtx;

Table renamed.

SQL> desc tx;
ERROR:
ORA-04043: object tx does not exist


SQL> desc newtx;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
A                                                  NUMBER(38)

SQL> comment on table tx is 'this my test table';

Comment created.

SQL> select * from user_tab_comments;


只看该作者    顶部
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-25 22:26 
约束---

行完整性:不允许重复记录
域完整性:不允许列重复
参照完整性:父子表联系(主外键)
用于:表级规则和阻止表间依赖的数据删除

类型:not null
     unique
     primary key
     foreign key
     check

约束可以:显式命名也可以系统自动命名

SQL> create table test1(id int not null,
  2  lname varchar2(20),
  3  fname varchar2(20),
  4  constraint uk_test1_l unique(lname,fname));

Table created.


insert into (lname,fname) values('zxy','zxz')
SQL> insert into test1(lname,fname) values('zxy','zxz');
insert into test1(lname,fname) values('zxy','zxz')
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."TEST1"."ID")

SQL> insert into test1 values(1,'s','z');

1 row created.

SQL> /
insert into test1 values(1,'s','z')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.UK_TEST1_L) violated


SQL> alter table test1 add constraint pk_test1 primary key(id);

Table altered.

create table test2 (rid int, constraint fk_constrait foreign key(rid) references test1(id))
SQL> /

Table created.

SQL> select * from test1;

        ID LNAME                FNAME
---------- -------------------- --------------------
         1 s                    z

SQL> insert into test2 values(2);---子表,外键在它上面,不能在子表插入一个主表不存在的记录
insert into test2 values(2)
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.FK_CONSTRAIT) violated - parent key not
found

SQL> delete from test1;---不能删除一个子表引用的主表记录
delete from test1
*
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.FK_CONSTRAIT) violated - child record
found


只看该作者    顶部
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-25 22:37 
1* alter table test add constraint test_a check(a>10)
SQL> /

Table altered.

SQL> insert into test values(2);
insert into test values(2)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.TEST_A) violated

此为功能增强
on delete cascade  ---当主表相应记录删除了,子表也要删除,父子表(主外键)为参照和被参照关系
on delete set null --把依赖外键=null


SQL> alter table test drop constraint test_a;

Table altered.

alter table test drop constraint pk_test cascade;---级联删除

alter table employees disable constraint emp_pk cascade;---暂时禁用constraint 状态


只看该作者    顶部
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-25 22:45 
SQL> select * from test;

         A
----------
         1

SQL> alter table test disable constraint pk_test;---用于加载数据时,事后又要开启约束

Table altered.

SQL> insert into test values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test;

         A
----------
         1
         1

SQL> alter table test enable constraint pk_test;
alter table test enable constraint pk_test
*
ERROR at line 1:
ORA-02437: cannot validate (SCOTT.PK_TEST) - primary key violated


SQL> alter table test drop constraint pk_test;

Table altered.


alter table test drop column a cascade constraint;---删除列时,相应约束也被删除
SQL> alter table test add b int;

Table altered.

SQL> desc test;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
A                                                  NUMBER(38)
B                                                  NUMBER(38)

SQL> alter table test add constraint unique_b unique(b);

Table altered.

SQL> insert into test values(1,2);

1 row created.

SQL> commit;

Commit complete.

SQL> insert into test values(1,2);
insert into test values(1,2)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.UNIQUE_B) violated


SQL> alter table test drop column b cascade constraint;

Table altered.

SQL> desc test;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
A                                                  NUMBER(38)


只看该作者    顶部
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-25 22:53 
select owner,constraint_name,table_name,column_name from user_cons_columns ---查约束


只看该作者    顶部
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-25 23:05 
view ---是一个逻辑结构,不包含具体的数据,也可能利用它来更新数据,命名sql语句,
        不可以含order by,不可能包含伪列

SQL> create view v_e as select * from emp;
create view v_e as select * from emp
            *
ERROR at line 1:
ORA-01031: insufficient privileges


SQL> conn /as sysdba;
Connected.
SQL> grant create any view to scott;

Grant succeeded.

SQL> conn scott/system;
Connected.
SQL> create view v_e as select * from emp;

View created.

SQL> create view v_emp
  2  as select * from emp order by empno;

View created.
create view v_emp1 as select a.rownum,a.* from emp a
SQL> /
create view v_emp1 as select a.rownum,a.* from emp a
                               *
ERROR at line 1:
ORA-01747: invalid user.table.column, table.column, or column specification


只看该作者    顶部
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-25 23:25 
简单视图              复杂视图  ---有很多限制条件
表的个数    1                     多个
包含function no                   yes
包含分组数据  no                  yes
dml          yes                  no

SQL> create view v_empa as select * from emb;
create view v_empa as select * from emb
                                    *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> create force view v_empa as select * from emb;

Warning: View created with compilation errors.

SQL> create table emb(a int);

Table created.

SQL> desc v_empa;--视图也可以desc
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
A                                                  NUMBER(38)

SQL> desc emb;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
A                                                  NUMBER(38)
SQL> create view v_emp  ---表明sum在视图定义中要以别名出现
  2  as
  3  select deptno,sum(sal)
  4  from emp
  5  group by deptno;
select deptno,sum(sal)
              *
ERROR at line 3:
ORA-00998: must name this expression with a column alias

1  create view v_empx
  2  as
  3  select deptno,sum(sal) summedsal
  4  from emp
  5* group by deptno
SQL> /

View created.


1  create view v_empx
  2  as
  3  select deptno,sum(sal) summedsal
  4  from emp
  5* group by deptno
SQL> /

View created.

SQL> cl scr;

SQL> cl scr;
SQL> create or replace view v_complex
  2  as
  3  select t1.deptno,t2.dname
  4  from emp t1,dept t2
  5  where t1.deptno=t2.deptno;

View created.

SQL> select * from v_complex;

    DEPTNO DNAME
---------- --------------
        20 RESEARCH
        30 SALES
        30 SALES
        20 RESEARCH
        30 SALES
        30 SALES
        10 ACCOUNTING
        20 RESEARCH
        10 ACCOUNTING
        30 SALES
        20 RESEARCH

    DEPTNO DNAME
---------- --------------
        30 SALES
        20 RESEARCH
        10 ACCOUNTING

14 rows selected.


只看该作者    顶部
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-25 23:41 
SQL> update v_emp set empno='8888' where ename='MILLER';---在简单视图中操作基表

1 row updated.

SQL> commit;

Commit complete.

SQL> select empno,ename from v_emp;

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS

     EMPNO ENAME
---------- ----------
      7900 JAMES
      7902 FORD
      8888 MILLER

14 rows selected.

with check option --有条件更改基表,就是把定义视图where,作过update条件,只有这样,才可以更新数据


SQL> select rownum as rank,sal
  2  from (select rownum,sal from emp order by sal desc)
  3  where rownum<5;

      RANK        SAL
---------- ----------
         1       5000
         2       3000
         3       3000
         4       2975


只看该作者    顶部
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-26 00:33 
sequence  --nextval,currval
---自动增加唯一
    共享所有
    一般用于产生主键
    为了加速访问,可以cache sequence

SQL> create sequence testseq
  2  start with 1
  3  increment by 2
  4  maxvalue 20;

SQL> drop sequence testseq;

Sequence dropped.

SQL> desc user_sequences;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
SEQUENCE_NAME                             NOT NULL VARCHAR2(30)
MIN_VALUE                                          NUMBER
MAX_VALUE                                          NUMBER
INCREMENT_BY                              NOT NULL NUMBER
CYCLE_FLAG                                         VARCHAR2(1)
ORDER_FLAG                                         VARCHAR2(1)
CACHE_SIZE                                NOT NULL NUMBER
LAST_NUMBER                               NOT NULL NUMBER


SQL> alter sequence mk start with 2;
alter sequence mk start with 2
                  *
ERROR at line 1:
ORA-02283: cannot alter starting sequence number


只看该作者    顶部
离线 wisdomone1
西北苍狼
希望会员


精华贴数 0
个人空间 0
技术积分 2454 (638)
社区积分 60 (4465)
注册日期 2007-3-15
论坛徽章:4
授权会员数据库板块每日发贴之星数据库板块每日发贴之星数据库板块每日发贴之星  
      

发表于 2008-6-26 10:00 
view ---是一个逻辑结构,不包含具体的数据,也可能利用它来更新数据
007-304看到一半了.

index --数据对象,可以分配空间,占用大小的,它是独立存在的物理结构,指向真始数据的指针.
        加速数据查询和减少io活动,index使用和维护是oracle自动完成

方式:自动primary key 和unique建约束,系统会自动建立相关索引
         SQL> create table ind(a int primary key,b int);

         Table created.
         SQL> create index idx_ind on ind(a);---表明建了主键约束,相应的索引会自动建立
         create index idx_ind on ind(a)
                            *
         ERROR at line 1:
         ORA-01408: such column list already indexed



     手动:就是显式建立索引

      但会增加数据dml的负荷,因数据变化,索引也要同步改变,这样工作量很大
构建索引原则:包含大量的值,可能含大量的空值,一或多个列多次用于查询条件,建议查询数据量为2-4%
user_ind_columns,user_indexes连接,可以查询索引相关情况


同义词简化用于对数据对象的访问 ---也就是自己要访问其它用户的对象
conn /as sysdba
grant select any table to scott;
grant create any synonym to scott;
conn scott/system;
desc test.sex1
select * from test.sex1;
create synonym sex1 for test.sex1;


只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问