zoukankan      html  css  js  c++  java
  • 数据库对象的创建和管理

    --数据库对象的创建和管理 DDL(数据定义语言)
        --表(table): 数据库存储的基本单元;
        --约束条件(constraint):用来确保数据库中数据的完整性,确保数据满足某些特定的商业规则
        --视图(view):一个或多个表的逻辑表示或虚拟表示,主要用于简化查询操作
        --索引(index):用于加速数据访问数据库对象,提高访问效率
        --序列(sequence):用于生成唯一数字值的数据库对象,序列的生成机制会自动生成顺序递增的数字,可以用来作为数据表的主键值
        --同义词(synonym):对象别名
    
        --数据类型: char,varchar,number,date,timestamp(默认的显示格式:DD-Mon-RR HH12.MI.SS AM)
        --             blob(二进制数据大对象类型) clob(字符大对象类型 <=4GB) bfile(数据库外部二进制文件)
    
        --数据字典  一些只读的表和视图
            --可参考http://www.cnblogs.com/jonescheng/archive/2008/03/24/1119380.html
            --racle中的数据表可以分为两大类:用户表和数据字典表.用户表:用户创建和维护,
            --数据字典表:由Oracle数据库自己创建和维护,存放数据库自身信息,包括描述数据库和它所有对象的信息,
            --以及一些统计分析数据库的视图等.
            --命名规则
            --DBA_***:指整个数据库包含的对象信息
                --DBA_TABLES:数据库中全部数据表  select count(1) from dba_tables; ==>2784
                --DBA_OBJECTS:数据库中全部对象  select * from dba_objects where owner ='SCOTT'; 
                --SCOTT创建的所有表和索引都在里面
                --DBA_DATA_FILES:数据库文件信息
            --ALL_**用户可以访问的对象信息   除了当前用户自己方案中的表外,还可以访问其它用户方案下有权限的表
                --ALL_TABLES;
                --ALL_INDEXES;
                --ALL_OBJECTS;
            --USER_***用户自己方案下的数据表
                --USER_TABLES;
                --USER_VIEWS;
                --USER_OBJECTS;
            --查询数据字典  
                describe dictionary; 
                --desc dict; 简写
                --查询数据字典里面的 USER_TABLES 表的信息
                select * from dictionary where table_name ='USER_TABLES';
    
        二、创建表
            --create table [schema.]table_name(column_name datetype [default expr] [,....]);
            --这里的schema默认为当前用户的方案,也可以制定其它用户
            --通过子查询创建表
            create table scott.emp30 as select * from emp where deptno =30;
            --基本创建表    无法执行,和命名空间有关系,等学完oracle整个结构在深入
            --encrypt 对数据的加密保存,待深入
            CREATE TABLE hr.admin_emp (
             empno      NUMBER(5) PRIMARY KEY,
             ename      VARCHAR2(15) NOT NULL,
             sex         CHAR(1) default 'M',
             ssn        NUMBER(9) ENCRYPT,
             job        VARCHAR2(10),
             mgr        NUMBER(5),
             hiredate   DATE DEFAULT (sysdate),
             photo      BLOB,
             sal        NUMBER(7,2),
             hrly_rate  NUMBER(7,2) GENERATED ALWAYS AS (sal/2080),
             comm       NUMBER(7,2),
             deptno     NUMBER(3) NOT NULL
                         CONSTRAINT admin_dept_fkey REFERENCES hr.departments
                         (department_id))
               TABLESPACE admin_tbs
               STORAGE ( INITIAL 50K);
               --应该是往数据字典里面添加comment
            COMMENT ON TABLE hr.admin_emp IS 'Enhanced employee table';
    
        --三、修改表    
            --增加列
                alter table emp10 add(sex char(1) default 'M');
            --增加表的constraint 因为列级的约束,可以直接通过修改列修改
                --alter table table_name add[CONSTRAINT constraint type (column,...)];
            --修改列
                alter table emp10 rename column empno to id;
                alter table emp10 modify(job varchar(20) default 'clerk');
            --删除列  必需保证该列下面的数据为空
                alter table emp10 drop (comm);
            --修改表名
                rename emp10 to employee10;
        --四、截断表  删除该表下面的所有数据
            --truncate 速度很快,并不在事务日志中记录所删除的数据,所以不能恢复,delete会在日志中记录删除操作,
            truncate table employee10;
    
        --五、删除表
            --drop table table_name [cascade constraint]
            --如果表被其它表参考(外键..)  需要使用 CASCADE CONSTRAINT;
            drop table employee10;
        --六、给表增加注释
            --comment on {table|column} {table_name|tablename.column} is 'comment_string';
    
            comment on table emp_20 is '部门编号是20的员工';
        --七、在数据字典中查看表信息
            --和表相关的数据字典有 USER_TABLES; USER_OBJECTS; USER_TAB_COMMENTS; USER_COLUMN_COMMENTS;
            select table_name from user_tables;
            select * from user_tab_comments where table_name ='EMP_20';
    
        --八、约束条件
            --create table [scheme.] table_name(
                column_name datatype [default expr] [column_constraint],
                [,...],
                [table_constraint]
            );
            --表级约束和列级约束语法如下:
            column_constraint =[CONSTRAINT constraint_name] constraint_type;
            table_constraint =[CONSTRAINT constraint_name] constraint_type(column,...);
            一、约束类型not null,unique,primary key,foreign key,check
                --1.not null
                    create table employees (
                        eid number(6),
                        --这个not null 约束由系统命名
                        name varchar(20) not null,
                        salary number(3,2),
                        --给not null约束起了一个名字(employees_hiredate_nn 规则:表名_列名_约束条件名称)
                        hiredate date CONSTRAINT employees_hiredate_nn not null
                    );
                    --在数据字典中查看constraint
                    select owner, constraint_name, constraint_type from user_constraints where table_name ='EMPLOYEES';
                --2.unique   规定了唯一constraint,Oracle数据库会自动建立一个索引,索引名称和约束名称相同
                    --给employees添加一列email并添加约束unique 
                    --1.直接把约束添加到lie中,
                    --2.给表添加约束,可以同时给两列添加约束,此时两列组合为键,
                    alter table employees add (email varchar(15) unique);
                    --alter table employees add(email varchar(15));
                    --alter table employees add CONSTRAINT employees_email_uk unique(name);
                --3.primary key 不能为null且unique 可是使用联合主键,两个列为主键
    
                --4.froeign key 定义在一个表的两个字段(自身关联),或者两个表的一个字段
                    alter table employees add(deptno number(4));
                    alter table employees add CONSTRAINT employees_deptno_fk foreign key(deptno) REFERENCES dept(deptno); 
    
                    --select * from user_cons_columns where table_name='EMPLOYEES';
                    --on delete cascade 删除主表值时,会删除从表的值
                    --ondelete set null 删除主表时,把从表的值置为null
                    -- alter table employees add constraint employess_deptno_fk foreign key(deptno)
                        references dept(deptno) [on delete cascade | on delete set null];
                --5.check 检查用来描述字段上的每个值都要满足check中定义的条件
                    alter table employees add CONSTRAINT employees_salary_ck check(salary >800);
    
                    insert into employees(eid,name, salary, hiredate, deptno) select empno, ename, sal, hiredate, deptno from emp where hiredate is not null and sal>800;
    
                --启用和禁用约束 暂时让约束失效,在批量导数据是有用
                    -- alter table table_name disable |enable CONSTRAINT constraint_name [cascade];
                    --cascade是指在关闭约束后,对外键的联级也消失
    
                    --显示该表所有约束
                        select c1.constraint_name,c2.constraint_type,c1.column_name from user_cons_columns c1,user_constraints c2 where c1.table_name='EMPLOYEES' and c1.constraint_name=c2.constraint_name;
                    --关闭所有约束
                    alter table employees disable constraint EMPLOYEES_SALARY_CK;
                    alter table employees disable constraint employees_deptno_fk cascade;
                    alter table employees disable constraint sys_c0011178;
                    alter table employees disable constraint sys_c0011176;
                    alter table employees disable constraint employees_hiredate_nn;
                    alter table employees enable constraint employees_hiredate_nn;
    
                    insert into employees(eid,name, salary, hiredate, deptno) select empno, ename, sal, hiredate, deptno from emp;
    
                    --导入数据后发现部分约束打不开了,因为数据不正常了
                    alter table employees enable constraint EMPLOYEES_SALARY_CK;
                    alter table employees enable constraint employees_deptno_fk ;
                    alter table employees enable constraint sys_c0011178;
                    alter table employees enable constraint sys_c0011176;
    
        --九、视图:虚表,一条查询语句得到的结果集.视图只包含映射导基表的一个查询语句,可以执行dml语句
            --优点:简化复杂查询,经常在多表上面执行发杂查询,就可以基于复杂查询创建视图,之后查询视图就好了
            1.创建视图
            create [ or replace] view view_name [(col_alias[,col_alias])] 
            as subquery [with read only];
            --create创建一个view,create or replace 修改视图
            col_alias定义视图中列的别名, with read  only 表示不能执行dml语句
    
            create view v_emp_10 as select empno, ename, sal salary, deptno from emp where deptno=10;    
    
            select * from v_emp_10;
    
            --获得每个部门的平均薪水和薪水总和,最高薪水,最低薪水的视图
            create or replace view v_emp_salary as select deptno, avg(sal) avg_sal,
            sum(sal) sum_sal, max(sal) max, min(sal) min from emp group by deptno;
            --获得每个部门的平均薪水和薪水总和,最高薪水,最低薪水的视图 使用视图别名
            create or replace view v_emp_salary (deptno, avg, sum, max, min) as 
            select deptno, avg(sal), sum(sal), max(sal), min(sal) from emp group by deptno;
    
            2.删除视图
                drop view v_emp_10;
            3.数据字典中查看视图 user_objects, user_views,user_updatable_columns,
                select object_name from user_objects where object_type='VIEW';
            select view_name, text from user_views;
    
            --因为包含了group by语句,所以这个并不是基表的直接映射,所以不能修改
            select column_name, insertable, updatable, deletable from user_updatable_columns where table_name='V_EMP_SALARY';
        --十、索引  应该是把索引和地址放在一个表里面,快速访问
            --用来在数据库中加速表查询的数据库对象,通过夸苏路径访问方式快速定位数据,可以有效的减少磁盘I/O操作,提高性能.
            --DML操作将会更新索引,增加了dml的时间.
            --创建索引的原则:
                1.为经常出现在where,order by,distinct子句中的列创建索引,
                2.连接条件的列加上索引
                3.不要在经常做dml操作的表加索引,不要在小表上面建索引,限制表的索引数目,
            1.创建索引
            create [unique] index index_name on table(column[,column...]);
    
            create index idx_emp_ename on emp(ename);
    
            select empno, ename, sal, job from emp where ename='SMITH';
    
            2.重构索引 经常做dml操作的表,需要定期重建索引
            alter index idx_emp_ename rebuild;
            3.删除索引
            drop index idx_emp_ename;
            4.在数据字典中查看索引 user_indexes, user_ind_columns; 
            select index_name from user_indexes where table_name='EMP';
        十一、序列
            用来生成唯一序列值的数据库对象,一般用来自动生成表的主键,
            --创建序列
                create sequence [schema.] sequence_name
                [start with i] [increament by j]
                [maxvalue m |nomaxvalue]
                [minvalue n |nominvalue]
                [cycle | nocycle] [cache p | nocache] 
                第一个值的序列i 步数j 最大值m 最小值n 
                cycle 递增至最大或者递减至最小之后是否继续生成序列号 
                cache 用来制定预取p个数据在缓存中,以提高序列的生成效率 
            --修改序列
                alter sequence [schema.] sequence_name
                [increament by j]
                [maxvalue m |nomaxvalue]
                [minvalue n |nominvalue]
                [cycle | nocycle] [cache p | nocache] 
    
            --删除序列
                drop sequence sequence_name;
            --数据字典 
                user_sequence
        十二、同义词
    
            1.创建共用同义词
            create public synonym synonym_name for [schema.]object;
            create public synonym public_emp for emp;
            select * from public_emp;
    
            2.创建私有的同义词 只用当前用户可以直接使用,其它用户访问需要该同义词对应表的访问权限
             create synonym private_emp for emp;
             select * from private_emp;
    
             3.删除同义词
             drop public synonym public_emp;
             drop synonym private_emp;
             4.数据字典中查看
             user_synonym;
    
    
    
        --参考书籍Oracle 11g数据库编程与实践  宁丽娟
  • 相关阅读:
    java代码--Date类获取当前时间-格式化输出
    Eclipse快速生成do while if 等方法
    java不同包中protected修饰的属性和方法调用方法
    java中如果删除导入的jar包,工程出现叹号解决方案
    Best Reward HDU 3613(回文子串Manacher)
    Teacher YYF
    Period II
    How many
    String Problem
    Corporate Identity
  • 原文地址:https://www.cnblogs.com/ylw666/p/6859986.html
Copyright © 2011-2022 走看看