在 Oracle 之中數據表就被稱為資料庫對象,而對象的操作語法一共有三種:· 創建對象:CREATE 對象類型 對象名稱 [選項];· 刪除對象:DROP 對象類型 對象名稱 [選項];· 修改對象:ALTER 對象類型 對象名稱 [選項]。 創建表 一般而言,預設值是為了防止用戶在增加數據時為 ...
在 Oracle 之中數據表就被稱為
資料庫對象,而對象的操作語法一共有三種:
· 創建對象:CREATE 對象類型 對象名稱 [選項];
· 刪除對象:DROP 對象類型 對象名稱 [選項];
· 修改對象:ALTER 對象類型 對象名稱 [選項]。
創建表
CREATE TABLE 表名稱 ( 欄位 類型 [DEFAULT 預設值] , 欄位 類型 [DEFAULT 預設值] , ... 欄位 類型 [DEFAULT 預設值] )
一般而言,預設值是為了防止用戶在增加數據時為 null 的問題。
複製表
實際上所謂的複製表嚴格來講不是複製的含義,是針對於一個子查詢(返回多行多列)的結果進行表的創建,完整
語法如下:
CREATE TABLE 表名稱 AS 子查詢
註意點:關於事務與 DDL 的問題
· 事務可以控制的只是數據的更新操作(增加、修改、刪除),而 DDL 是不受事務控制的;
· 在 Oracle 之中,如果發生了 DDL 操作,那麼所有未提交的事務將會自動進行提交。
在 Oracle 之中有三類數據字典:
· user_*:用戶可以使用的數據字典;
· dba_*:管理員可以使用到的數據字典;
· all_*:包含了當前用戶可以訪問的全部數據字典信息(有可能某些數據字典不屬於此用戶)。
為表重命名
RENAME 舊的表名稱 TO 新的表名稱 ;
截斷表
TRUNCATE TABLE 表名稱 ;
表一旦被截斷,其所有占用的資源都將被徹底釋放。
刪除數據表
DROP TABLE 表名稱 ;
閃回操作
從 Oracle 10g 起為了方便用戶進行數據表的恢復。為 Oracle 增加了一個類似於 windows 的回收站功能,等於是所有
刪除是數據表,首先保存在回收站之中,如果用戶有需要也可以進行恢復。
範例:通過回收站恢復 emp10 數據表 FLASHBACK TABLE emp10 TO BEFORE DROP ; 範例:徹底刪除數據表,不讓刪除的數據表經過回收站,在刪除語句之後增加一個 PURGE DROP TABLE emp10 PURGE ; 範例:刪除回收站之中的一個表 PURGE TABLE empnull ; 範例:清空回收站 PURGE RECYCLEBIN ; 只有 oracle 有此特性
修改表結構
1、 為表中增加數據列 ALTER TABLE 表名稱 ADD( 列名稱 數據類型 [DEFAULT 預設值], 列名稱 數據類型 [DEFAULT 預設值], ...) 2、 修改列結構 ALTER TABLE 表名稱 MODIFY( 列名稱 數據類型 [DEFAULT 預設值], 列名稱 數據類型 [DEFAULT 預設值], ...) ;
從標準的 SQL 來講,是一定要提供有數據表的修改操作的,但是從實際的開發來講,任何人都不允許有隨意修改數
據表結構的想法,而且更不能說自己去修改。
約束是保證表中數據完整性的一種有效檢測手
非空約束(NOT NULL,NK)
DROP TABLE member ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20) NOT NULL ) ; INSERT INTO member(mid,name) VALUES(1,null)
此時,資料庫會提示如下錯誤信息:“ORA-01400: 無法將 NULL 插入 ("SCOTT"."MEMBER"."NAME")”。此時會
明確的顯示出那個欄位上違反了非空約束。
唯一約束(UNIQUE,UK)
DROP TABLE member ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20) NOT NULL , email VARCHAR2(20) UNIQUE ) ; 範例:增加正確的數據 INSERT INTO member(mid,name) VALUES (1,'王小強') ; INSERT INTO member(mid,name,email) VALUES (1,'王大強','[email protected]') ; 在使用唯一約束的時候一定要記住,null 不屬於重覆的統計範疇。 範例:增加錯誤的數據 INSERT INTO member(mid,name,email) VALUES (1,'王中強','[email protected]') ; 此時出現了錯誤的提示信息:“ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C0011101)”。但是與之前的非空約束相 比,此時的提示信息非常不明確。
DROP TABLE member PURGE ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20)NOT NULL , email VARCHAR2(20) , CONSTRAINT uk_email UNIQUE(email) ) ;
此時,如果保存的數據出現了錯誤,則提示信息“ORA-00001: 違反唯一約束條件 (SCOTT.UK_EMAIL)”。
除了非空約束之外,所有的約束都一定要按照以上的方式進行設置,因為只有一個正常的名稱才方便系統進行約束
的維護
主鍵約束(PRIMARY KEY,PK)
主鍵約束 = 非空約束 + 唯一約束。
DROP TABLE member PURGE ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20)NOT NULL , CONSTRAINT pk_mid PRIMARY KEY(mid) ) ;
觀察複合主鍵 DROP TABLE member PURGE ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20) , CONSTRAINT pk_mid_name PRIMARY KEY(mid,name) ) ; INSERT INTO member(mid,name) VALUES(1,'學冰') ; INSERT INTO member(mid,name) VALUES(1,'學刁') ; INSERT INTO member(mid,name) VALUES(2,'學刁') ; 正常人都不用,知道就行了,千萬別用。
檢查約束(CHECK,CK)
DROP TABLE member PURGE ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20)NOT NULL , sex VARCHAR2(10) , age NUMBER(3) , CONSTRAINT pk_mid PRIMARY KEY(mid) , CONSTRAINT ck_sex CHECK (sex IN ('男','女')) , CONSTRAINT ck_age CHECK (age BETWEEN 0 AND 250) ) ;
即使設置了多個檢查約束,那麼也是一個一個約束進行過濾的。
但是在這裡有一個提示:一般而言,你所設置的約束越多,在進行數據更新操作的時候性能就越低。所以很多時候
一些數據的檢查操作都會交給程式完成
主-外鍵約束(FOREIGN KEY,FK)
DROP TABLE member PURGE ; DROP TABLE book PURGE ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20)NOT NULL , CONSTRAINT pk_mid PRIMARY KEY(mid) ) ; CREATE TABLE book( bid NUMBER , title VARCHAR2(20) , mid NUMBER , CONSTRAINT pk_bid PRIMARY KEY(bid) , CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ) ;
限制一:在刪除主表之前,請一定要保證先刪除子表。所以在刪除數據表的時候應該先刪除子表後再刪除父表。
範例:強制刪除 DROP TABLE member CASCADE CONSTRAINT ; 但是必須註意的是,強制刪除是無法徹底刪除的,所刪除的數據表會保存在回收站之中。但是不建議使用強制刪除 表的操作,還是建議按照先刪除子表再刪除父表的方式進行。
限制二:作為外鍵的欄位在主表之中必須具備主鍵約束或者是唯一約束。
限制三:數據的級聯操作問題
· 為了方便數據的刪除,提供有一個級聯刪除操作,在主表數據刪除的時候對應的子表數據會同時刪除掉,在建立
外鍵的時候使用 ON DELETE CASCADE 來設置。
範例:設置級聯刪除 DROP TABLE book PURGE ; DROP TABLE member PURGE ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20)NOT NULL , CONSTRAINT pk_mid PRIMARY KEY(mid) ) ; CREATE TABLE book( bid NUMBER , title VARCHAR2(20) , mid NUMBER , CONSTRAINT pk_bid PRIMARY KEY(bid) , CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE CASCADE ) ;
· 如果在刪除主表數據的時候不希望子表數據被一起刪除掉,則可以使用級聯更新操作,使用 ON DELETE SET
NULL 來設置。
範例:設置級聯更新 DROP TABLE book PURGE ; DROP TABLE member PURGE ; CREATE TABLE member( mid NUMBER , name VARCHAR2(20)NOT NULL , CONSTRAINT pk_mid PRIMARY KEY(mid) ) ; CREATE TABLE book( bid NUMBER , title VARCHAR2(20) , mid NUMBER , CONSTRAINT pk_bid PRIMARY KEY(bid) , CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE SET NULL ) ;
修改約束
首先明確:所有的約束一定要在表建立的同時就已經設置完成,不可能說表先去使用之後再回頭設置約束,所以以
下的這些
1、 為表中增加約束 ALTER TABLE 表名稱 ADD CONSTRAINT 約束名稱 約束類型(約束欄位) [選項] ; 但是需要提醒的是,此類的語法適合於唯一、主鍵、檢查、外鍵約束的添加,而無法添加非空約束 2、 刪除約束 ALTER TABLE 表名稱 DROP CONSTRAINT 約束名稱 ;
意義