1. 程式人生 > >數據庫對象的創建和管理

數據庫對象的創建和管理

htm cascade and asc cti min tab cts column

--數據庫對象的創建和管理 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數據庫編程與實踐 寧麗娟

數據庫對象的創建和管理