Oracle DB 使用DDL語句建立和管理表
阿新 • • 發佈:2018-11-07
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
• 對主要的資料庫物件進行分類 • 查看錶結構 • 列舉列可以使用的資料型別 • 建立簡單的表 • 說明建立表時如何建立約束條件 • 描述方案物件如何工作
• 資料庫物件 – 命名規則 • CREATE TABLE語句: – 訪問另一個使用者的表 – DEFAULT選項 • 資料型別 • 約束條件概覽:NOT NULL、UNIQUE、PRIMARY KEY、 FOREIGN KEY、CHECK約束條件 • 使用子查詢建立表 • ALTER TABLE – 只讀表 • DROP TABLE語句
- 資料庫物件
Oracle DB 可以包含多種資料結構。在資料庫設計中應對每種結構加以概述,以便可在 資料庫開發的構建階段建立資料庫結構。 • 表:用於儲存資料 • 檢視:一個或多個表中資料的子集 • 序列:用於生成數字值 • 索引:提高某些查詢的效能 • 同義詞:給出物件的替代名稱 Oracle 表結構 • 在任何時候都可以建立表,即使使用者正在使用資料庫時也是如此。 • 無需指定表的大小。表的大小最終由全部分配給資料庫的空間量確定。但是,需要 估計一個表將要使用的空間大小,這一點非常重要。
- 命名規則
應根據命名任意Oracle DB 物件的標準規則來命名資料庫表和列: • 表名和列名必須以字母開頭,長度必須為1-30 個字元。 • 名稱中只能包含字元A-Z、a-z、0-9、_(下劃線)、$ 和#(這兩個字元是合法字元, 但建議不要使用它們)。
- CREATE TABLE語句
通過執行SQL CREATE TABLE語句可以建立用於儲存資料的表。此語句是一條DDL 語 句,DDL 語句是SQL 語句的子集,用於建立、修改或刪除Oracle DB 結構。這些語句會 對資料庫產生直接的影響,它們還會在資料字典中記錄資訊。 要建立一個表,使用者必須具有CREATE TABLE許可權和一個用於在其中建立物件的儲存區。 資料庫管理員(DBA) 可以使用資料控制語言(DCL) 語句為使用者授權。 在該語法中: schema 與所有者的姓名相同 table 是表名稱 DEFAULT expr 指定當INSERT語句中省略了值時所使用的預設值語句 column 是列名稱 datatype 是列的資料型別和長度
- 引用另一個使用者的表
方案是由資料或方案物件構成的一組邏輯結構。方案由資料庫使用者擁有,而且與該使用者 具有相同的名稱。每個使用者都擁有一個方案。 方案物件可使用SQL 來建立和操作;方案物件包括表、檢視、同義詞、序列、儲存過程、 索引、叢集和資料庫連結。 如果某個表不屬於該使用者,則必須將所有者的姓名作為該表的字首。例如,假設存在名為 USERA和USERB的兩個方案,每個方案都有一個EMPLOYEES表,如果USERA要訪問 屬於USERB的EMPLOYEES表,USERA就必須將USERB方案名作為該表名的字首: SELECT * FROM userb.employees; 如果USERB要訪問屬於USERA的EMPLOYEES表,USERB就必須將USERA的方案名 作為該表名的字首: SELECT * FROM usera.employees;
- DEFAULT選項
CREATE TABLE hire_dates (id NUMBER(8), hire_date DATE DEFAULT SYSDATE);
在定義表時,可以使用DEFAULT選項指定列的預設值。當插入的行中沒有某列的相應值 時,使用此選項可以防止將空值輸入到列中。預設值可以是文字值、表示式或SQL 函式 (例如SYSDATE或USER),但是該值不能是其它列或假列的名稱(例如NEXTVAL或 CURRVAL) 。預設表示式必須與列的資料型別相匹配。 請看如下示例: INSERT INTO hire_dates values(45, NULL); 以上語句將插入空值而非預設值。 INSERT INTO hire_dates(id) values(35); 以上語句將在HIRE_DATE列中插入SYSDATE。
- 建立表
示例中建立的DEPT表包含以下四列:DEPTNO、DNAME、LOC和CREATE_DATE。 CREATE_DATE列具有預設值。如果沒有為INSERT語句提供值,則會自動插入系統日期。 要確認該表是否已建立,請執行DESCRIBE命令。 因為建立表的命令是一條DDL 語句,所以在執行該語句後會自動提交。 注:可以通過查詢資料字典來檢視你擁有的表列表。例如: select table_name from user_tables 使用資料字典檢視,還可以查詢有關其它資料庫物件(例如檢視、索引等)的資訊。
- 資料型別
在指定表的列時,需要提供列的資料型別。下面是幾種可用的資料型別:
準則 • 在使用子查詢建立表時不復制LONG列。 • 不能在GROUP BY或ORDER BY子句中包括LONG列。 • 每個表只能使用一個LONG列。 • 不能對LONG列定義約束條件。 • 可以要求使用CLOB列,而不是LONG列。
- 日期時間資料型別
- 包括約束條件
- 包括約束條件
Oracle Server 使用約束條件來防止將無效的資料輸入到表中。 可以使用約束條件完成以下任務: • 在表中插入、更新或刪除某一行時,對錶中的資料強制執行各種規則。必須滿足約束 條件,操作才會成功。 • 防止當某個表與其它表存在相關性時刪除該表。 • 為Oracle 工具(例如Oracle Developer)提供規則。
- 約束條件準則
所有約束條件都儲存在資料字典中。如果為約束條件指定了一個有意義的名稱,則引用時 較為容易。約束條件名稱必須遵循標準物件命名規則,但是 該名稱不能與同一使用者的另一 物件名稱相同 。如果你沒有對約束條件命名,Oracle Server 就會按照SYS_Cn格式生成 一個名稱,其中n是一個整數,這樣約束條件名稱是唯一的。 既可以在建立表的同時定義約束條件,也可以在建立表之後定義約束條件。 你可以在列 級別或表級別定義約束條件。從功能上來說,表級別約束條件與列級別約束條件的作用是 相同的。
- 定義約束條件
• 列級別約束條件語法: column[CONSTRAINT constraint_name] constraint_type,
• 表級別約束條件語法: column,... [CONSTRAINT constraint_name] constraint_type (column, ...),
示例給出了在建立表時定義約束條件的語法。你可以在列級別或表級別建立約束條件。 定義列時會包括在列級別定義的約束條件。在表定義結束時定義表級別約束條件,必須 在一組括號中引用應用了約束條件的列或列組合。這二者主要在語法上有所不同;此外 從功能上來說,列級別約束條件和表級別約束條件的作用是相同的。 必須在列級別定義NOT NULL約束條件。 必須在表級別定義適用於多個列的約束條件。 在該語法中: schema :與所有者的姓名相同 table :是表名稱 DEFAULT expr :指定當INSERT語句中省略了值時所使用的預設值 column: 是列名稱 datatype :是列的資料型別和長度 column_constraint:是作為列定義一部分的完整性約束條件 table_constraint :是作為表定義一部分的完整性約束條件
• 列級別約束條件示例: CREATE TABLE employees( employee_id NUMBER(6) CONSTRAINT emp_emp_id_pk PRIMARY KEY, first_name VARCHAR2(20), ...);
• 表級別約束條件示例: CREATE TABLE employees( employee_id NUMBER(6), first_name VARCHAR2(20), ... job_id VARCHAR2(10) NOT NULL, CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));
通常會在建立表的同時建立約束條件。可以在建立表之後將約束條件新增到表,也可以 臨時禁用約束條件。 示例中都對EMPLOYEES表的EMPLOYEE_ID列建立了主鍵約束條件。 1.第一個示例使用列級別語法定義約束條件。 2.第二個示例使用表級別語法定義約束條件。
- NOT NULL約束條件
- UNIQUE約束條件
可以在表級別或列級別定義: CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL, ... CONSTRAINT emp_email_uk UNIQUE(email)); 可以在列級別或表級別定義UNIQUE約束條件。如果要建立一個組合唯一關鍵字,則可 在表級別定義該約束條件。如果不能使用單個屬性來唯一地標識某一行,則需定義組合 關鍵字。在這種情況下,可以建立由兩個或兩個以上列組成的唯一關鍵字,其組合值總 是唯一的,可用於標識行。 示例中將UNIQUE約束條件應用於EMPLOYEES表的EMAIL列。該約束條件的 名稱為EMP_EMAIL_UK。 注:Oracle Server 通過對一個或多個唯一關鍵字列 隱式建立一個唯一索引來強制實現 UNIQUE約束條件。
- PRIMARY KEY約束條件
- FOREIGN KEY約束條件
可以在列級別或表級別定義FOREIGN KEY約束條件。必須使用表級別定義來建立組合 外來鍵。 示例中使用表級別語法,對EMPLOYEES表的DEPARTMENT_ID列定義一個 FOREIGN KEY約束條件。該約束條件的名稱為EMP_DEPT_FK。 如果約束條件只是針對單個列,則也可以在列級別定義外來鍵。語法上的不同之處在於沒有 出現關鍵字FOREIGN KEY。例如: CREATE TABLE employees (... department_id NUMBER(4) CONSTRAINT emp_deptid_fk REFERENCES departments(department_id), ... )
- FOREIGN KEY約束條件:關鍵字
外來鍵是在子表中定義的,而包含被引用列的表是父表。外來鍵是使用以下關鍵字的組合 定義的: • FOREIGN KEY用於在表約束條件級別定義子表中的列。 • REFERENCES用於標識父表中的表和列。 • ON DELETE CASCADE指出在刪除父表中的行時,還刪除子表中的相關行。 • ON DELETE SET NULL指出在刪除父表中的行時,將外來鍵值設為空值。 預設行為被稱為限制規則,該規則可禁止更新或禁止刪除被引用的資料。 在沒有ON DELETE CASCADE或ON DELETE SET NULL選項時,如果在子表中引用 父表中的一行,則不能刪除該行。
- CHECK約束條件
CHECK約束條件用於定義每行都必須滿足的一個條件。該條件可以使用與查詢條件相同 的結構,但是以下項除外: • 引用CURRVAL、NEXTVAL、LEVEL和ROWNUM假列的表示式 • 呼叫SYSDATE、UID、USER和USERENV函式的表示式 • 引用其它行中的其它值的查詢 一個列可以有多個CHECK約束條件,這些約束條件將在其定義中引用該列。可以按需要, 對一個列定義任意數量的CHECK約束條件。 可以在列級別或表級別定義CHECK約束條件。 CREATE TABLE employees (... salary NUMBER(8,2) CONSTRAINT emp_salary_min CHECK (salary > 0), ...
示例中顯示用於建立HR方案中EMPLOYEES表的語句 CREATE TABLE employees ( employee_id NUMBER(6) CONSTRAINT emp_employee_id PRIMARY KEY , first_name VARCHAR2(20) , last_name VARCHAR2(25) CONSTRAINT emp_last_name_nn NOT NULL , email VARCHAR2(25) CONSTRAINT emp_email_nn NOT NULL CONSTRAINT emp_email_uk UNIQUE , phone_number VARCHAR2(20) , hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL , job_id VARCHAR2(10) CONSTRAINT emp_job_nn NOT NULL , salary NUMBER(8,2) CONSTRAINT emp_salary_ck CHECK (salary>0) , commission_pct NUMBER(2,2) , manager_id NUMBER(6) CONSTRAINT emp_manager_fk REFERENCES employees (employee_id) , department_id NUMBER(4) CONSTRAINT emp_dept_fk REFERENCES departments (department_id));
通過以下查詢表中哪列有哪些約束,上面建立表的語句對應下面的約束。 [email protected]> l 1 select a.owner,a.TABLE_NAME,b.COLUMN_NAME,a.CONSTRAINT_NAME,a.CONSTRAINT_TYPE,a.SEARCH_CONDITION 2 from USER_CONSTRAINTS a,USER_CONS_COLUMNS b 3* where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME and A.table_name='EMPLOYEES' [email protected]> /
OWNER TABLE_NAME COLUMN_NAM CONSTRAINT_NAME C SEARCH_CONDITION ---------- ------------------------------ ---------- ------------------------------ - -------------------- HR EMPLOYEES SALARY EMP_SALARY_MIN C salary > 0 HR EMPLOYEES EMAIL EMP_EMAIL_UK U HR EMPLOYEES EMPLOYEE_ID EMP_EMP_ID_PK P HR EMPLOYEES DEPARTMENT_ID EMP_DEPT_FK R HR EMPLOYEES JOB_ID EMP_JOB_FK R HR EMPLOYEES MANAGER_ID EMP_MANAGER_FK R HR EMPLOYEES LAST_NAME EMP_LAST_NAME_NN C "LAST_NAME" IS NOT N ULL HR EMPLOYEES EMAIL EMP_EMAIL_NN C "EMAIL" IS NOT NULL HR EMPLOYEES HIRE_DATE EMP_HIRE_DATE_NN C "HIRE_DATE" IS NOT N ULL HR EMPLOYEES JOB_ID EMP_JOB_NN C "JOB_ID" IS NOT NULL
10 rows selected.
- 違反約束條件
[email protected]> update employees set department_id=55 where department_id=110; update employees set department_id=55 where department_id=110 * ERROR at line 1: ORA-02291: integrity constraint (HR.EMP_DEPT_FK) violated - parent key not found
如果某行中包含用作其它表中的外來鍵的主鍵,則不能刪除 該行。 [email protected]> delete from departments where department_id=60; delete from departments where department_id=60 * ERROR at line 1: ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated - child record found
如果試圖刪除一條記錄,但該記錄中的值受完整性約束條件所約束,則會返回一條錯誤。 示例中試圖從DEPARTMENTS表中刪除部門60,但此操作導致一個錯誤,因為該 部門編號已用作EMPLOYEES表中的外來鍵。如果試圖刪除具有子記錄的父記錄,則會 收到違例ORA-02292“child record found(存在子記錄)”。 由於部門210 中沒有任何僱員,因此下面的語句有效: [email protected]> delete from departments where department_id=210;
1 row deleted.
- 使用子查詢建立表
建立表的另一種方法是應用AS subquery子句,該方法既可以建立表,又可以將子查詢 返回的行插入表中。 在該語法中: table 是表名稱 column 是列的名稱、預設值和完整性約束條件 subquery 是一條SELECT語句,用於定義要插入到新表中的一組行 準則 • 使用指定的列名建立一個表,然後將SELECT語句檢索到的那些行插入到該表中。 • 列定義只能包含列名和預設值。 • 如果已經給出列的規格,則列數必須等於子查詢SELECT列表中的列數。 • 如果沒有給出列的規格,則表的列名與子查詢中的列名相同。 • 列資料型別定義和NOT NULL約束條件會傳遞到新表中,請注意,只會繼承顯式 NOT NULL約束條件。PRIMARY KEY列不會將NOT NULL特性傳遞給新列。任何 其它約束條件規則也不會傳遞到新表中。但是,你可以在列定義中新增約束條件。
- 使用子查詢建立表
CREATE TABLE dept80 AS SELECT employee_id, last_name,salary*12 ANNSAL,hire_date FROM employees WHERE department_id = 80;
DESCRIBE dept80
示例中建立了一個名為DEPT80的表,該表包含在部門80 中工作的所有僱員的 詳細資料。請注意,DEPT80表中的資料來自EMPLOYEES表。 可以使用DESCRIBE命令驗證資料庫表的存在,並檢查列定義。 但是,在選擇表示式時請務必提供列別名。表示式SALARY*12被賦予了別名ANNSAL。 如果沒有別名,系統就會生成以下錯誤: [email protected]> CREATE TABLE dept80 2 as 3 SELECT employee_id, last_name,salary*12 ,hire_date FROM employees WHERE department_id = 80;SELECT employee_id, last_name,salary*12 ,hire_date FROM employees WHERE department_id = 80 * ERROR at line 3: ORA-00998: must name this expression with a column alias
- ALTER TABLE語句
在建立表之後,可能會因以下原因而需要更改表結構: • 省略了某列。 • 列定義或列名需要更改。 • 需要刪除列。 • 要將表設定為“只讀”模式。 可以使用ALTER TABLE語句完成此任務。
- 只讀表
在Oracle Database 11g中,可以通過指定READ ONLY將表設定為“只讀”模式。當表 處於READ-ONLY模式時,使用者不能發出可對錶造成影響的任何DML 語句或任何 SELECT ... FOR UPDATE語句。可以發出DDL 語句,但前提條件是不對錶中的任何 資料進行修改。當表處於READ ONLY模式時,可以對與表關聯的索引執行操作。 指定READ/WRITE,可令處於“只讀”模式的表返回“讀/寫”模式。 注:可以刪除處於READ ONLY模式的表。DROP命令只能在資料字典中執行,因此無需 訪問表內容。在表空間返回“讀/寫”狀態之前,系統不會回收表使用的空間,此時可對 塊段頭進行必要的更改。
- 刪除表
使用DROP TABLE語句可以將表移至回收站或從資料庫中全部刪除該表及其所有資料。 如果不指定PURGE子句,DROP TABLE語句就不會將使用的空間重新釋放到表空間中供 其它物件使用,而且該空間會繼續視為使用者的空間限額。刪除表會使從屬物件失效並刪除 表的物件許可權。 刪除表後,在資料庫中會失去表的所有資料以及與表關聯的 所有索引。 語法 DROP TABLE table [PURGE] 在該語法中,table是表的名稱。 準則 • 刪除表中的所有資料。 • 保留檢視和同義詞,但不再有效。 • 提交所有待定的事務處理。 • 只有表的建立者或具有DROP ANY TABLE許可權的使用者才能刪除表。 注:使用FLASHBACK TABLE語句可從回收站中還原已刪除的表。