■表和視圖不可以重名,但表可以和索引、約束同名。表名和列名都是不區分大小寫的,Oracle會先把名字轉換為大寫,
? 再把它們存儲在數據字典中。如果名字中用雙引號("")括起來,它會在oracle數據字典中成為區分大小寫的名字.
? 注意:
? 大對象數據類型的列不能出現在WHERE,GROUP BY或ORDER BY子句中。
? 不能在SQL*Plus等環境中查詢、顯示大對象類型的數據,也不能通過INSERT語句插入大對象類型的數據,否則會出錯。
■
如果將表的存儲參數MAXEXTENTS設置為UNLIMITED,那么表就可以不受限制地自動獲取所需要的存儲空間,并且減少浪費
? 存儲空間和產生存儲碎片的可能.
■創建臨時表(事務臨時表/會話臨時表)
? 如果創建臨時表時沒有使用ON COMMIT關鍵字,則默認創建的是事務臨時表。通過指定ON COMMIT DELETE ROWS關鍵字,
? 也可以指定創建事務臨時表。
■創建事務臨時表
? SQL> create global temporary table temp1????????????????????????????????????????????????????????????????????????????????????????????
? 2? (id number(9) primary key,?????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? name varchar2(20));
?
事務臨時表的數據只在當前事務內可以查看,當使用COMMIT或ROLLBACK結束事務后,其臨時數據會被自動清除。
■創建會話臨時表
? 創建臨時表時通過
ON COMMIT PRESERVE ROWS
關鍵字指定創建會話臨時表。
? SQL> create global temporary table temp2????????????????????????????????????????????????????????????????????????????????????????????
? 2? (id number(9) primary key,?????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? name varchar2(20)??????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 4? )??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 5? on commit preserve rows;
區別:
???
事務臨時表是指數據只在當前事務內有效的臨時表。
??? 會話臨時表是指數據只在當前會話內有效的臨時表。
??
■標準表與索引表的區別
? 標準表 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 索引表
? 使用ROWID來惟一標識一行記錄,并不一定要指定主鍵 ? ? ? ? ? ? ?使用主鍵來惟一標識一行記錄,必須指定主鍵
? 對記錄的訪問是基于ROWID的 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 對記錄的訪問是基于主鍵的,或邏輯ROWID
? 通過順序掃描訪問返回的記錄 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 通過全索引掃描訪問返回的記錄
? ROWID偽列中保存的是物理ROWID ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ROWID偽例中保存的是邏輯ROWIDE?
??
■創建一個索引結構表
SQL> create table iot1??????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 2? (ID number(9),?????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? name varchar2(20),?????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 4? address varchar2(30),??????????????????????????????????????????????????????????????????????????????????????????????????????????
? 5? note varchar2(40),?????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 6?
constraint pk_id primary key (id) validate?
?? ? ?-----指定主鍵 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? 7? )??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 8?
organization index ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ------指明是索引表的關鍵字 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? 9? pctthreshold 40????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?10? including address ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?------非主鍵列 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?11? overflow tablespace myts01; ? ? ? ? ? ? ? ? ? ? ? ?------溢出的數據存在myts01表空間
■通過查詢從一個表創建另一個表
? CREATE TABLE table_name AS SELECT <query>;
? 這個語法經常用CTAS來表示.
? 在子查詢中可以引用一個或多個表(或視圖),查詢結果集中包含的列即是新表中定義的列,并且查詢到的記錄都會插入到新表中.
?
在使用CTAS創建表時要注意如下幾點:
? ◆ 可以修改新表中列的名稱,但是不能修改列的數據類型和長度。新表中所有列的數據類型和長度都必須與查詢列一致。
? ◆ SELECT語句中不能包含大對象數據類型和long數據類型
? ◆ 約束條件及列的默認值定義等都不會被復制
? ◆ 建議使用NOLOGGING選項。因為如果不使用NOLOGGING選項,則每插入一條記錄都將會產生重做日志信息,占用了空間和時間。在決定是否使用
???? NOLOGGING選項時,必須綜合考慮所獲得的收益和風險。通常只需要在創建大表時才使用NOLOGGING子句,以獲得較大的性能提升。
???
? SQL> create table new_emp???????????????????????????????????????????????????????????????????????????????????????????????????????????
? 2? as?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? select * from emp??????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 4? noglogging;
??
? 使用CTAS創建表的時候不能指定表空間,否則會出錯.
? SQL> create table new_emp???????????????????????????????????????????????????????????????????????????????????????????????????????????
? 2? as?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? select * from emp??????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 4? nologging??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 5? tablespace users;??????????????????????????????????????????????????????????????????????????????????????????????????????????????
? tablespace users
? *
? 第 5 行出現錯誤:
? ORA-00933: SQL 命令未正確結束
??
■只復制表的結構,而不復制數據.
? SQL> create table new_emp_1?????????????????????????????????????????????????????????????????????????????????????????????????????????
? 2? as?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? select * from emp??????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 4?
where 1=2;????
????????????????????????????????????????????????????????????????????????????????????????????????????????????????
■只復制表的幾個列的結構和數據,并更改列名.使用NOLOGGING選項來避免生成重做日志文件記錄,減少創建表時所需的時間
?
■更改表
? ◆ 添加或刪除表中的列,或者修改表中列的定義(包括數據類型、長度、默認值,以及NOT NULL約束等)
? ◆ 對表進行重新命名
? ◆ 將表移動到其他數據段或表空間中,以便重新組織表。
? ◆ 添加、修改或刪除表中的約束條件
? ◆ 激活或禁用表中的約束條件、觸發器等。
■添加列
?
語法:ALTER TABLE [schema.]table_name ADD (column_definition);
? 新添加的列總是位于表的末尾。對于現有的行而言,新增列的值為NULL,即無值.column_definition部分包括列名、列的數據類型
? 和將具用的任何默認值.
SQL> alter table department add?????????????????????????????????????????????????????????????????????????????????????????????
? 2? (??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? leader varchar2(20),???????????????????????????????????????????????????????????????????????????????????????????????????
? 4? updatedate date default sysdate????????????????????????????????????????????????????????????????????????????????????????
? 5? );????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
表已更改。
SQL> desc department;???????????????????????????????????????????????????????????????????????????????????????????????????????
?名稱????????????????????????????????????? 是否為空? 類型
?----------------------------------------- -------- --------------------
?DEPTID??????????????????????????????????? NOT NULL NUMBER(9)
?DEPTNO??????????????????????????????????? NOT NULL CHAR(2)
?NAME?????????????????????????????????????????????? VARCHAR2(20)
?ADDRESS??????????????????????????????????????????? VARCHAR2(30)
?LEADER???????????????????????????????????????????? VARCHAR2(20)
?UPDATEDATE???????????????????????????????????????? DATE
? SQL> select * from department;?????????????????????????????????????????????????????????????????????????????????????????????
??? DEPTID DE NAME???????????????? ADDRESS??????????????????????? LEADER?????????????? UPDATEDATE
---------- -- -------------------- ------------------------------ -------------------- --------------
???????? 5 5? 航天航空系統???????? 4 號樓????????????????????????????????????????????? 09-12月-06
? 在添加新列的時候,如果該表中已經有行記錄了,那么就不能指定NOT NULL約束.
? 這時就需要用一個DEFAULT子句,再添加一個NOT NULL約束來完成這樣的工作,如下:
? SQL> alter table department add?????????????????????????????????????????????????????????????????????????????????????????????
? 2? (??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? node varchar2(40) not null?????????????????????????????????????????????????????????????????????????????????????????????
? 4? );?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
alter table department add
??????????? *
第 1 行出現錯誤:
ORA-01758: 要添加必需的 (NOT NULL) 列, 則表必須為空
SQL> alter table department add?????????????????????????????????????????????????????????????????????????????????????????????
? 2? (??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? node varchar2(40) default '備注' not null??????????????????????????????????????????????????????????????????????????????
? 4? );????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
表已更改。
■修改列
?
語法:ALTER TABLE [schema.]table_name MODIFY (column_name new_attributes);
? SQL> desc department;???????????????????????????????????????????????????????????????????????????????????????????????????????
?名稱????????????????????????????????????????????????????????????? 是否為空? 類型
?----------------------------------------------------------------- -------- -------------------------
?DEPTID??????????????????????????????????????????????????????????? NOT NULL NUMBER(9)
?DEPTNO??????????????????????????????????????????????????????????? NOT NULL CHAR(2)
?NAME?????????????????????????????????????????????????????????????????????? VARCHAR2(20)
?ADDRESS??????????????????????????????????????????????????????????????????? VARCHAR2(30)
?LEADER???????????????????????????????????????????????????????????????????? VARCHAR2(20)
?UPDATEDATE???????????????????????????????????????????????????????????????? DATE
?NODE????????????????????????????????????????????????????????????? NOT NULL VARCHAR2(40)
SQL> alter table department modify??????????????????????????????????????????????????????????????????????????????????????????
? 2? (??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? deptno char(6),????????????????????????????????????????????????????????????????????????????????????????????????????????
? 4? node varchar2(80)??????????????????????????????????????????????????????????????????????????????????????????????????????
? 5? );????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
表已更改。
SQL> desc department;???????????????????????????????????????????????????????????????????????????????????????????????????????
?名稱????????????????????????????????????????????????????????????? 是否為空? 類型
?----------------------------------------------------------------- -------- --------------------------
?DEPTID??????????????????????????????????????????????????????????? NOT NULL NUMBER(9)
?DEPTNO??????????????????????????????????????????????????????????? NOT NULL CHAR(6)
?NAME?????????????????????????????????????????????????????????????????????? VARCHAR2(20)
?ADDRESS??????????????????????????????????????????????????????????????????? VARCHAR2(30)
?LEADER???????????????????????????????????????????????????????????????????? VARCHAR2(20)
?UPDATEDATE???????????????????????????????????????????????????????????????? DATE
?NODE????????????????????????????????????????????????????????????? NOT NULL VARCHAR2(80)
■下面以刪除department表中的updatedate列的sysdate默認值為例,介紹刪除列的約束.
? SQL> alter table department modify??????????????????????????????????????????????????????????????????????????????????????????
? 2? (updatedate default null);?????????????????????????????????????????????????????????????????????????????????????????????
? 表已更改。
? SQL> insert into department?????????????????????????????????????????????????????????????????????????????????????????????????
? 2? (deptid,deptno,name,address)???????????????????????????????????????????????????????????????????????????????????????????
? 3? values?????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 4? (4,'04','航天航空系','4 號樓');???????????????????????????????????????????????????????????????????????????????????????
已創建 1 行。
SQL> select deptid,deptno,name,address,updatedate,node from department;????????????????????????????????????????????????????
??? DEPTID DEPTNO NAME???????????????? ADDRESS??????????????????????? UPDATEDATE???? NODE
---------- ------ -------------------- ------------------------------ -------------- ----------------
???????? 5 5????? 航天航空系統???????? 4 號樓???????????????????????? 09-12月-06???? 備注
???????? 4 04???? 航天航空系?????????? 4 號樓??????????????????????????????????????? 備注
?
■對列定義不是可以任意修改的,下面是用于修改列定義的一些原則
? ◆ 可以增大字符型列的長度和數據值型列的精度.如果表中有許多行,那么增大一個CHAR列的長度將需要許多資源,因為所有這些行的列數據
???? 都需要添加空格以添補額外增大的長度.
? ◆ 如果相關列中所有的數據都可以符合新的長度,那么可以減小VARCHAR2列的長度,并減小數值型列的精度(precision),或者增大一個數值型
???? 列的尺度(scale)
? ◆ 如果參數BLANK_TRIMMING被設置TRUE,那么可以降低一個非空CHAR列的長度.
? ◆ 為了更改數據類型,相關的列值必須為NULL.
? ◆ 如果不減小其長度,那么可以把數據類型從CHAR更改為VARCHAR2或反過來,即使相關的列不為空也可以.
■刪除列
? 直接刪除(全部刪除)?
? 語法:ALTER [schema.]table_name?
?????? DROP (colum_names) [CASCADE CONSTRAINTS];
? 可以在括號中使用多個列名,每個列名用逗號分隔.相關列的索引和約束也會被刪除.如果刪除的列是一個多列約束的組成部分,
? 那么就必須指定CASCADE CONSTRAINTS選項,這樣才會刪除相關的約束
? SQL> alter table department
? 2? drop (updatedate,node)
? 3? cascade constraints;
? SQL> desc department;???????????????????????????????????????????????????????????????????????????????????????????????????????
?名稱????????????????????????????????????? 是否為空? 類型
?----------------------------------------- -------- ----------------------------
?DEPTID??????????????????????????????????? NOT NULL NUMBER(9)
?DEPTNO??????????????????????????????????? NOT NULL CHAR(6)
?NAME?????????????????????????????????????????????? VARCHAR2(20)
?ADDRESS??????????????????????????????????????????? VARCHAR2(30)
?LEADER???????????????????????????????????????????? VARCHAR2(20)
■將其標記為UNUSED狀態(部分刪除)
?
如果要刪除一個大表中的列,由于必須對每條記錄進行處理,故刪除操作可能會執行很長的時間.為了避免在數據庫使用高峰期間由于執行刪除列
? 的操作而占用過多的系統資源,可以暫時將刪除的列的設置為UNUSED狀態.
? 語法:ALTER TABLE [schema.]table_name
?????? SET UNUSED (colum_names) [CASCADE CONSTRAINTS];
SQL> alter table department set unused??????????????????????????????????????????????????????????????????????????????????????
? 2? (address,leader)???????????????????????????????????????????????????????????????????????????????????????????????????????
? 3? cascade constraints;
? 從用戶角度來看,被設置為UNUSED狀態的列與被刪除的列之間是沒有區別的,都無法通過查詢或在數據字典中看到,并且可以為表添加與UNUSED狀態
? 的列具有相同名稱的新列.但是實際上UNUSED狀態的列仍然被保存在表中,它們所占用的存儲空間并沒有被釋放.
?
表中被標記為UNUSED狀態的列可以在以后適當的時候再刪除,其語法:
? ALTER TABLE [schema.]table_name DROP UNUSED COLUMNS;
? SQL> alter table department?????????????????????????????????????????????????????????????????????????????????????????????????
? 2? drop unused columns;?
??
? 在數據字典視圖USER_UNUSED_COL_TABLS,ALL_UNUSED_COL_TABS和DBA_UNUSED_COL_TABS中可以查看數據庫中哪些表有幾個被標記為UNUSED狀態.
■給表或列添加注釋
? SQL> comment on table new_emp IS????????????????????????????????????????????????????????????????????????????????????????????
? 2? '這是一個通過CTAS方法創建的表.?????????????????????????????????????????????????????????????????????????????????????????
? 3? 既創建了表的結構和表的記錄';?
?
? 如果要想顯示關于表的注釋,可以查詢DBA_TAB_COMMENTS,ALL_TAB_COMMENTS或者USER_TAB_COMMENTS.
? SQL> select table_name,table_type,comments
? 2? from user_tab_comments
? 3? where table_name='NEW_EMP';
TABLE_NAME???????????????????? TABLE_TYPE? COMMENTS
------------------------------ ----------- -----------------------------------------------
NEW_EMP??????????????????????? TABLE?????? 這是一個通過CTAS方法創建的表.
■給列或列添加注釋
? SQL> comment on column new_emp.ename IS?????????????????????????????????????????????????????????????????????????????????????
? 2? '這是雇員的姓名';
? 如果要想顯示關于列的注釋,可以查詢DBA_COL_COMMENTS,ALL_COL_COMMENTS或者USER_TAB_COMMENTS.
? SQL> select table_name,column_name,comments
? 2? from user_col_comments
? 3? where table_name='NEW_EMP'
? 4* AND column_name='ENAME'
TABLE_NAME???????????????????? COLUMN_NAME??????????????????? COMMENTS
------------------------------ ------------------------------ ------------------------------
NEW_EMP??????????????????????? ENAME????????????????????????? 這是雇員的姓名
■重新命名表和重新組織表
? 當重新命名表時,oracle自動把舊表上的視圖、對象權限和約束條件轉換到新表名上,但oracle會使所有與舊表相關的對象(如視圖、同義詞、
? 存儲過程、函數)失效,如果要使用,需要重新定義或編譯。
■RENAME語句
? 語法: RENAME old_tablename TO new_tablename
■ALTER TABLE語句
? SQL> ALTER TABLE new_emp RENAME TO new_emp_change;
■重新組織表
? SQL> alter table new_emp MOVE;
■重新組織表并移到其它表空間中
? SQL> alter table new_emp move???????????????????????????????????????????????????????????????????????????????????????????????
? 2? tablespace myts01;
??
? 使用ALTER TABLE ... MOVE 語句重新組織表時,有如下幾個值得注意的地方。
? ◆ 直接到表被完全移到新的數據段中之后,Oracle才會刪除原來的數據段.因此在進行移動時,必須保證表空間有足夠的空閑空間.
? ◆ 執行ALTER TABLE ... MOVE語句重新組織表時,ROWID會發生改變,從而導致表的所有有索引轉變為無效狀態,所以在重新組織表
???? 之后必須重新建立索引.
? ◆ 如果表中包含LOB列,這個語句可用于將表連同用戶明確指定的LOB數據和LOB索引段(與該表相關的)一起移動.如果沒有指定,則
???? 默認不多動LOB數據和LOB索引段.
■刪減表和刪除表
■刪減表(p530)
? 刪減表就是刪除表中所有的記錄,使表成為一個只有結構而沒有數據的一個空表.
? 在Oracle中,如果要刪除表中所有的記錄,可以使用如下三種方法之一
? 方法一:
? SQL> delete from new_emp;
? 方法二:
? SQL> drop table new_emp;
? SQL> create table new_emp
?????? AS select * from emp
?????? nologging;
? 方法三:(最佳方法)
?
SQL> truncate table new_emp;
???
? TRUNCATE語句提供了一種快速、高效、最低代價的刪除表中所有記錄的方法。TRUNCATE語句屬于DDL語句,不會產生任何回退信息,
? 并且是被自動立即提交的。因此TRUNCATE操作也不能被回退。
? 在執行TRUNCATE語句時,不會影響到與被刪減表相關的任何數據庫對象和授權,也不會觸發表中定義的觸發器。此外,在對表進行
? 刪減后,已經為表分配的存儲空間將被回收。無論從內容上還是從結構上看,刪減后的表都成為了一個空表。
? TRUNCATE語句刪減表中所有記錄是最佳的方法。
■刪除表
?語法: drop table [schema.]table_name [cascade constraints]
?SQL> drop table new_emp;
?SQL> drop table new_emp CASCADE CONSTRAINTS;
■約束分類
?
- NOT NULL(非空)約束
?- UNIQUE(唯一)約束
?- CHECK(檢查)約束
?- PRIMARY KEY(主鍵)約束
?- FOREIGN KEY(外鍵)約束
■約束的狀態
? -----------------------------------------------
? 分類方式??狀態?
? -----------------------------------------------
? 檢查新數據 ??激活?ENABLE
? ???禁用?DISABLE
? 檢查老數據??驗證?VALIDATE
???非驗證 NOVALIDATE
? 兩類狀態的組合?激活驗證 ENABLE VALIDATE
???????????????????? 激活非驗證 ENABLE NOVALIDATE
???????????????????? 禁用驗證 DISABLE VALIDATE
???????????????????? 禁用非驗證 DISABLE NOVALIDATE
■列級定義
? 語法:column [CONSTRAINT constraint_name] constraint_type [condition]
■表級定義
? 語法:[CONSTRAINT constraint_name] constraint_type ([col1,col2,...] | [condition])
? 注意:不能在具有大對象(CLOB,NCLOB,BLOB,BFILE)、二進制(LONG和LONG RAW)或
??????? TIMESTAMP WITH TIMEZONE數據類型的列上定義約束。
? SQL> create table student
? 2? (
? 3? stuid number(9) NOT NULL,?? ---> 列級定義
? 4? stuno char(10),
? 5? name varchar2(20) NOT NULL, ---> 列級定義
? 6? sex char(1),
? 7? birthday date,
? 8? photo blob,
? 9? deptid number(9),
?10? CONSTRAINT pk_student PRIMARY KEY (stuid) VALIDATE,??? ---> 表級定義
?11? CONSTRAINT chk_sex CHECK (sex in('1','0')) VALIDATE,?? ---> 表級定義
?12? CONSTRAINT fk_deptid FOREIGN KEY (deptid) REFERENCES department(deptid) VALIDATE?? ---> 表級定義
?13? )
?SQL> /
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
