Oracle编程入门经典 第3章 建立以及管理用户和表
- 數據定義語言(DDL)。
- 怎樣建立我們自己的用戶賬號。
- 可以用于Oracle表的不同數據類型。
- 怎樣在表上建立約束。
- 怎樣使用數據詞典獲取與數據庫中對象有關的信息。
3.1 數據定義語言
DDL通常用于建立和管理數據庫。它可以使用SQL建立對象、配置數據庫安全、管理統計數據以及完成其它功能。
在第2章中,我COMMIT和ROLLBACK。在表中執行插入、更新和刪除等操作之后使用COMMIT語句,就可以使修改結果在用戶數據庫中永久存在。
當用戶向數據庫發出DDL語句的時候,則在語句執行前后就產生隱匿的COMMIT語句(即使DDL失敗)。這是因為DDL不能進行回滾,而且,這也意味著DDL語句使用之前任何沒有提交的改變也不能夠進行回滾。
在DDL完成之后(由于它不能夠進行回滾),ORACLE會調用另一個隱式的COMMIT,為用戶開始一個新的事務處理。偽代碼如下:
| 1 2 3 4 5 6 7 8 9 | Insert?into?some_table values(…): Insert?into?some_table values(…): Create?table?another_table(column1 data type,column2 data type); Insert?into?another_table values(…); Insert?into?another_table values(…); |
那么Oracle就會在后臺為我們執行如下操作:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | Insert?into?some_table values(…): Insert?into?some_table values(…): Commit; Create?table?another_table(column1 data type,column2 data type); Commit; Insert?into?another_table values(…); Insert?into?another_table values(…); |
如果進行ROLLBACK,前三條記錄仍然存在,ANOTHER_TBALE表中的三條記錄就會丟失。
合法的Oracle標識符
Oracle遵守如下規則:
- 它不能是Oracle保留字(如SELECT等)
- 它必須使用1到30個字符。例外的情況數據庫的名稱(最多8個字符)和數據庫鏈接(最多128個字符)
- 它必須以數據庫字符集中的字母字符開頭
- 它只能夠包含數據庫字集中的字母字符,以及以下字符:#、$、_(另外,數據庫連接可以包含‘@’和‘.’)
- 它不能夠包含(單或者雙)引號
如下的標識符列表為非法:
- %EMP(不能包含%)
- SELECT(Oracle保留字)
- THIS_NAME_IS_LONGER_THAN_30_CHARACTERS
- 1STCOLUMN(不能使用數字開始)
- SEAN’S_TABLE(不能包含引號)
3.2 表空間
在Oracle中,數據庫被分割成為了稱為表空間的獨立存儲單元。這些表空間是存放表、懿旨以及其它消耗磁盤空間的數據庫對象的地方。
3.3 用戶
用戶可能要為自己的數據建立自己的用戶賬號。這項工作很重要,因為用戶應該避免使用Oracle提供的SYS和SYSTEM賬號,或者我們曾經在前面的章節中使用過的SCOTT賬號。
3.3.1 建立用戶
DBA角色是一個具有超過120個系統特權的角色。
CREATE_SESSION是一個系統特權,它可以為用戶提供連接數據庫的能力。
IDENTIFIED BY <標識符>是用來給出用戶的密碼(如下密碼為zyf)
以SYSTEM最高權限帳戶進入,建立用戶賬號,并賦予DBA特權:
| 1 2 3 4 5 6 7 8 9 | SQL> create?user?oracle_admin identified by?zyf 2 / 用戶已創建 SQL> grant?create?session,dba to?oracle_admin; 授權成功。 |
注意:
DBA角色可以讓用戶完全控制數據庫,盡管這種權利在數據庫的時候是完成必要的,但是如果它掌握在錯誤的用戶手里,也將是非常危險的。
在建立USER的時候,一些可用的選項如下所示:
- DEFAULT TABLESPACE。除非另行規定,否則用戶所建立的對象都會存儲在它們用戶的默認表空間中。如果沒有明確規定,這個默認值就是SYSTEM。
- TEMPORARY TABLESPACE。例如在查詢中進行排序需要空間這樣的臨時字段,都會在用戶的臨時表空間中進行分配。在Oracle 9i之前,這個默認值都是SYSTEM表空間。在Oracle 9i中,默認的臨時表空間是TEMP。
- QUOTA。用戶可以為它們存儲數據的表空間賦予配額。這是用戶能夠在表空間中分配的最大空間數。
- PASSWORD EXPIRE。使用這個子句意味著用戶在他們第一次登錄的時候必須改變他們的密碼。
3.3.2 改變用戶
當管理數據庫的時候,用戶可能會有各種原因來改變用戶賬號:
- 重置用戶密碼
- 鎖定賬號和解除賬號鎖定
- 修改用戶的默認表空間或者臨時表空間
- 修改表空間配額
1. 重置密碼
ALTER USER命令以及IDENTIFIED BY子句,改變密碼。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | SQL> create?user?oracle_admin identified by?zyf 2 / 用戶已創建 SQL> grant?create?session,dba to?oracle_admin; 授權成功。 SQL> alter?user?oracle_admin identified by?oracle_admin; 用戶已更改。 |
2. 鎖定賬號以及解除賬號鎖定
在Oracle中,可以將用戶賬號鎖定,以使它們不能使用。如下語法:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ALTER?USER?<username> ACCOUNT [LOCK|UNLOCK]; SQL> connect?oracle_admin/oracle_admin; 已連接。 SQL> connect?system/zyf 已連接。 SQL> alter?user?oracle_admin account lock; 用戶已更改。 SQL> connect?oracle_admin/oracle_admin; ERROR: ORA-28000: the account is?locked 警告: 您不再連接到 ORACLE。 |
3. 修改表空間設置
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | SQL> select?tablespace_name,contents from?dba_tablespaces; TABLESPACE_NAME CONTENTS ------------------------------ --------- SYSTEM PERMANENT UNDOTBS1 UNDO TEMP?TEMPORARY CWMLITE PERMANENT DRSYS PERMANENT EXAMPLE PERMANENT INDX PERMANENT ODM PERMANENT TOOLS PERMANENT USERS PERMANENT XDB PERMANENT 已選擇11行。 |
將默認表空間設置為USERS,臨時表空間設置為TEMP。
| 1 2 3 | SQL> alter?user?oracle_admin default?tablespace users temporary?tablespace temp; 用戶已更改。 |
4. 修改表空間配額
UNLIMITED關鍵字指出用戶可以在USERS表空間中存儲數據,直到它被完全占滿。我們設置了TEMP表空間中的存儲上限為10M,SYSTEM表空間中為0M。
| 1 2 3 4 5 6 7 8 9 10 11 | SQL> alter?user?oracle_admin 2 quota unlimited on?users 3 quota 10M on?temp 4 quota 0M on?system 5 / 用戶已更改。 |
3.3.3 刪除用戶
為了刪除用戶,使用DROP USER命令。
CASCADE如果將其用于DROP USER命令末尾,就可以讓Oracle知道應該在從數據庫移走用戶之前,刪除用戶的所有對象(例如:表、視圖、以及過程代碼)。
試驗:建立和刪除用戶
(1) 連接ORACLE_ADMIN賬號,建表DROPME授權
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SQL> connect?oracle_admin/oracle_admin 已連接。 SQL> create?user?dropme 2 identified by?doomed 3 default?tablespace users 4 temporary?tablespace temp 5 quota unlimited on?users 6 / 用戶已創建 SQL> grant?create?session,create?table?to?dropme 2 / 授權成功。 |
(2) 作為DROPME用戶連接數據庫,并且建立一個如下所示的簡單表:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SQL> connect?dropme/doomed 已連接。 SQL> create?table?employees_backup( 2 employee_id number, 3 last_name varchar2(30), 4 email varchar2(100) 5 ) 6 / 表已創建。 |
(3) 使用ORACLE_ADMIN賬號(它具有DROP USER特權)刪除用戶DROPME:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | SQL> connect?oracle_admin/oracle_admin 已連接。 SQL> drop?user?dropme; drop?user?dropme * ERROR 位于第 1 行: ORA-01922: 必須指定 CASCADE?以刪除'DROPME' |
(4) DROPME用戶擁有一個表,使用CASCADE關鍵字,如下所示:
| 1 2 3 | SQL> drop?user?dropme cascade; 用戶已丟棄 |
3.4 Oracle數據類型
3.4.1 數值類型
數值類型可以用于存儲整數、浮點值以及實數。在Oracle中的NUMBER數據類型具有精度(precision)和范圍(scale)。精度是數值中的數字總數,可以為1到38個數字之間的任何值。范圍取值可以從0到3,它表述了任何給定數值的小數點右邊的位數。
| 1 | <column_name>NUMBER(precision[, scale]) |
聲明示例如:NUMBER(即NUMBER(38))、NUMBER(9,2)、NUMBER(4,10)。
3.4.2 字符類型
1. CHAR
CHAR數據長度的數值將會讓SQL使用空格填充剩余長度。例如:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | SQL> create?table?authorized_blends( 2 bean_name char(50) 3 ); 表已創建。 SQL> insert?into?authorized_blends values('Papua New Guinea'); 已創建 1 行。 SQL> insert?into?authorized_blends values('Ethiopia'); 已創建 1 行。 SQL> insert?into?authorized_blends values('Sumatra'); 已創建 1 行。 SQL> select?bean_name,length(bean_name) 2 from?authorized_blends 3 / BEAN_NAME LENGTH(BEAN_NAME) -------------------------------------------------- ----------------- Papua New Guinea 50 Ethiopia 50 Sumatra 50 |
2. NCHAR
NCHAR數據類型使用了與CHAR數據類型大體相同的方法來存儲固定長度的字符數據。兩者之間的差異僅僅在于在數據庫中存儲NCHAR數據的方式不同。
3. VARCHAR2
VARCHAR2數據類型與CHAR類型非常相似,兩者之間的不同之處在于類型VARCHAR2的聲明是可變長度,而非固定長度(不會像CHAR一樣有空格對值的填充)。
4. NVARCHAR2
NVARCHAR2列可以存儲可變長度的基于字符的數據,它大體使用與VARCHAR2數據類型相同的方式進行工作。它們兩者之間的主要差異是NVARCHAR2數據在數據庫中的存儲方式。
5. 長度語義
Oracle不能夠自動考慮到多字節字符集。Oracle 9i中可以在列大小附加BYTE或者CHAR,以告訴Oracle怎樣解釋數值。
6. RAW
RAW數據類型與VARCHAR2相似,雖然RAW列可以用于存儲可變長度的二進制數據,而不是字符數據。RAW列的最大長度是2000個字節。
7. LONG和LONG RAW
LONG數據類型可以用于在單獨的列中存儲大數據量的可變長度字符數據。LONG列的大小最高可以為2GB。在Oracle8中,可以使用CLOB或者NCLOB數據類型對其進行替代。
LONG RAW數據類型就如同它們的名字所描述的那樣,是一個可以遠遠超過2000個字節的RAW數據類型。當聲明LONG RAW列的時候,不用規定其大小。與此相對,LONG RAW列能夠包含最高到2GB的二進制數據或者字節。在Oracle 8i中,建議管理員使用BLOB或者BFILE數據類型。
8. 大對象
在Oracle 8中引入了大對象或者稱為LOB。它們為基于二進制和字符的大規模數據,提供了比以前的LONG RAW數據類型列靈活的存儲機制。特別是:
- LOB在數據庫中存儲物理數據時,可以進行一些選擇。
- LOB可以在Oracle對象類型中使用。
- LOB支持對數據的分段訪問。
- 每種類型的LOB都可以存儲4GB的數據。
- 在Oracle提供的PL/SQL程序包DBMS_LOB中,提供了處理LOB的功能。
9. LOB類型
有一些不同類型的LOB:
- 二進制大對象(BLOB)。
- 字符大對象(CLOB)。
- 國家字符大對象(NCLOB)。
- 二進制文件(BFILE)。
10. LOB定位符
LOB定位符是在使用外掛方式或者在BFILE中存儲LOB的時候,在表的記錄中實際存儲的對象。它通常是一個指向實際LOB的指針,可以告訴Oracle怎樣在需要的時候獲取LOB。這種方式可以避免在進行全表搜索的時候,讓Oracle遍歷表的數據塊中存儲的成百上千的帶有LOB的記錄。通過使用在表中存儲的LOB定位符來代替實際數據,Oracle就可以讀取表的數據塊,而使LOB定位符的影響最小。
3.4.3 日期和時間
Oracle提供如下類別的時間數據類型:
- DATE
- TIMESTAMP
- TIMESTAMP WITH TIME ZONE*
- TIMESTAMP WITH LOCAL TIME ZONE*
- INTERVAL YEAR TO MONTH*
- INTERVAL DAY TO SECOND*
這些標記了*的類型只存在于Oracle 9i中。
1. DATE
TO_DATE和SYSDATE
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | SQL> connect?oracle_admin/oracle_admin; 已連接。 SQL> create?table?company_events( 2 event_name varchar2(100), 3 event_date date) 4 / 表已創建。 SQL> insert?into?company_events(event_name,event_date) values('Created DATE Sample code',SYSDATE); SQL> insert?into?company_events(event_name,event_date) values('Oracle Open World',to_date('2-12月-2001','DD-MON-YYYY')); SQL> column?event_name format a40; SQL> select?* from?company_events; EVENT_NAME EVENT_DATE ---------------------------------------- ---------- Created DATE?Sample code 31-12月-12 Oracle Open?World 02-12月-01 |
SHOW PARAMETERS來判斷我們數據庫的默認日期格式,如下所示:
| 1 2 3 4 5 6 7 | SQL> show parameters nls_date_format; NAME?TYPE VALUE --------------------- ------------ ----------- nls_date_format string |
DATE關鍵字規定日期值,如下語法實現:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SQL> insert?into?company_events(event_name,event_date) values('Created an Oracle 9i DATE value',DATE '2001-10-11'); 已創建 1 行。 SQL> select?* from?company_events; EVENT_NAME EVENT_DATE ---------------------------------------- ---------- Created DATE?Sample code 31-12月-12 Oracle Open?World 02-12月-01 Created an Oracle 9i DATE?value 11-10月-01 |
2. TIMESTAMP
| 1 | <column_name> TIMESTAMP?[SECONDS_PRECISION] |
例如:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | SQL> create?table?other_company_events( 2 event_name varchar2(100), 3 event_date date, 4 event_timestamp timestamp); 表已創建。 SQL> insert?into?other_company_events(event_name,event_date,event_timestamp) values('Created COMPAN _EVENTS table',sysdate,sysdate); 已創建 1 行。 SQL> column?event_name format a28; SQL> column?event_date format a18; SQL> column?event_timestamp format a28; SQL> select?event_name,to_char(event_date,'DD-MON-YY HH24:MI:SS') event_date,event_timestamp from?ot her_company_events; EVENT_NAME EVENT_DATE EVENT_TIMESTAMP ---------------------------- ------------------ ---------------------------- Created COMPANY_EVENTS table?31-12月-12 16:26:5 31-12月-12 04.26.59.000000 9 下午 |
在這個例子中,我們向兩個列EVENT_DATE和EVENT_TIMESTAMP中插入了SYSDATE。當從這個表中選擇數據的時候,我們就能夠看到TIMESTAMP列為SECOND字段提供了6位數字的精度,而DATE列沒有存儲小數部分的秒。
3. TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH TIME ZONE數據類型是TIMESTAMP數據類型的擴展。語法如下:
| 1 | <column_name> TIMESTAMP?[SECONDS_PRECISION] WITH?TIME?ZONE |
(1) 建立名為CONFERENCE_CALLS的表,然后插入與三個電話會議有關的信息:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SQL> create?table?conference_calls( 2 title varchar2(100), 3 phone varchar2(20), 4 place varchar2(100), 5 starts timestamp?with?time?zone) 6 / 表已創建。 SQL> insert?into?conference_calls(title,phone,place,starts) 2 values('Sales Strategy','212.123.4567','Washington',TIMESTAMP?'2001-12-01 15:00:00.000000 EST') 已創建 1 行。 |
(2) 查詢所處的時區
| 1 2 3 4 5 6 7 | SQL> select?dbtimezone from?dual; DBTIME ------ -07:00 |
(3) 查詢所有在當前本地時間15:00的記錄
| 1 2 3 4 5 | SQL> select?title,phone from?conference_calls 2 where?starts=TIMESTAMP?'2001-12-01 15:00:00.000000 -7:00'; 未選定行 |
4. TIMESTAMP WITH LOCAL TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE與TIMESTAMP WITH TIME ZONE大體相同,只是在前一種情況中,要根據用戶會話時區在列中存儲時區數據。語法如下:
| 1 | <column_name> TIMESTAME [SECONDS_PRECISION] WITH?LOCAL?TIME?ZONE |
如:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SQL> create?table?local_conference_calls( 2 title varchar2(100), 3 phone varchar2(20), 4 place varchar2(100), 5 starts timestamp?with?local?time?zone); 表已創建。 SQL> insert?into?local_conference_calls(title,phone,place,starts) 2 values('Sales Strategy','212.123.4567','New York',TIMESTAMP?'2001-12-01 15:00:00.000000 EST'); 已創建 1 行。 |
ALTER SESSION SQL語句為我們的會話設置時區。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | SQL> alter?session set?time_zone='-05:00'; 會話已更改。 SQL> column?title format a25; SQL> column?stats format a30; SQL> select?title,starts from?local_conference_calls; TITLE ------------------------- STARTS --------------------------------------------------------------------------- Sales Strategy 01-12月-01 03.00.00.000000 下午 英國時區: SQL> alter?session set?time_zone='GMT'; 會話已更改。 SQL> select?title,starts from?local_conference_calls; TITLE ------------------------- STARTS --------------------------------------------------------------------------- Sales Strategy 01-12月-01 08.00.00.000000 下午 |
5. INTERVAL YEAR TO MONTH
它可以用于存儲月或者年的時間周期。
| 1 | INTERVAL YEAR?[(YEAR_PRECISION)] TO?MONTH |
這個年精度(YEAR_PRECISION)值規定了可以在間隔值的YEAR字段中包含的數字數量。合法值為0到9,默認值是2。
6. INTERVAL DAY TO SECOND
INTERVAL DAY TO SECOND是Oracle 9i中的另一個間隔數據類型,它可以用于存儲天、小時、分鐘以及秒。語法如下:
| 1 | INTERVAL DAT [(DAY_PRECISION)] TO?SECOND?[(SECONDS_PRECISION)] |
如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | SQL> create?table?employee_breaks( 2 employee_id number, 3 break_reason varchar2(100), 4 break_time interval day(1) to?second(2)); 表已創建。 SQL> insert?into?employee_breaks values(100,'COFFEE BREAK',TIMESTAMP?'2001-09-03 12:47:00.000000'-TI MESTAMP '2001-09-03 13:13:00.000000'); 已創建 1 行。 SQL> column?break_reason format a20; SQL> column?break_time format a20; SQL> select?employee_id,break_reason,break_time from?employee_breaks; EMPLOYEE_ID BREAK_REASON BREAK_TIME ----------- -------------------- -------------------- 100 COFFEE BREAK -0 00:26:00.00 |
3.4.4 ANSI數據類型
Oracle支持工業標準的ANSI數據類型,以及IBM DB/2和SQL/DS數據類型。這些類型出于一些原因會很有用:
- 一些數據庫設計工具可以導出可以被其它類型的數據庫使用的ANSI兼容SQL。
- 一些在其他數據庫上使用的SQL腳本不需要轉換成為Oracle語法就可以在Oracle中使用。
1. 數值數據類型轉換表
表3-2 數值數據類型轉換表
| 可用SQL數據類型 | Oracle等價數據類型 |
| NUMERIC(PRECISION,SCALE) | NUMBER(PRECISION,SCALE) |
| DECIMAL(PRECISION,SCALE) | NUMBER(PRECISION,SCALE) |
| INTEGER | NUMBER(38) |
| INT | NUMBER(38) |
| SMALLINT | NUMBER(38) |
| FLOAT(b) | NUMBER |
| DOUBLE PRECISION | NUMBER |
| REAL | NUMBER |
2. 字符數據類型轉換表
表3-3 字符數據類型轉換表
| 可用SQL數據類型 | Oracle等價數據類型 |
| CHARACTER(size) | CHAR(size) |
| CHAR(size) | CHAR(size) |
| CHARACTER VARYING(size) | VARCHAR(size) |
| CHAR VARYING(size) | VARCHAR(size) |
| NATIONAL CHARACTER(size) | NCHAR(size) |
| NATIONAL CHAR(size) | NCHAR(size) |
| NCHAR(size) | NCHAR(size) |
| NATIONAL CHARACTER VARYING(size) | NVARCHAR2(size) |
| NATION CHAR VARYING(size) | NVARCHAR2(size) |
| NCHAR VARYING(size) | NVARCHAR2(size) |
3.5 建立表
建立表的最簡單和最常見的方法會如下語法:
| 1 2 3 4 5 6 7 8 9 | CREATE?TABLE?[SCHEMA.].<table_name>( <column_name> <data type> [DEFAULT?<expression>] [<constraint>] [,<column_name> <data type> [DEFAULT?<expression>] [<constraint>] [,…] ); |
SCHEMA。這是表所屬的用戶名稱,或者模式名稱。
TABLE_NAME。這是要建立的表的名稱。
COLUMN_NAME。這是在表中要建立的列的名稱。
DATA TYPE。
DEFAULT <expression>。對于每個列,用戶都可以定義一個默認值,以用于沒有為列插入語句提供值的情況。
CONSTRAINT。用戶可以選擇在用戶建立的各個列上定義約束。
3.5.1 約束
在Oracle中,可以使用一些聲明型完整性約束,來確保用戶數據正確。
聲明型完整性(declarative integrity)是可以用于表列的強制規則。
參照完整性(referential integrity)是使Oracle成為關系數據庫的重要組成部分。
1. 約束語法
| 1 2 3 4 5 6 7 8 9 | CREATE?TABLE?[SCHEMA.].<table_name>( <column_name> <data type> [DEFAULT?<expression>] [<constraint>] [,<column_name> <data type> [DEFAULT?<expression>] [<constraint>] [,…] ); |
還可以使用ALTER TABLE 語句向表中添加約束,如下所示:
| 1 2 3 4 5 6 7 | ALTER?TABLE?[SCHEMA.]<table_name> ADD?[CONSTRAINT?[<name>]] <constraint?definition> ); |
2. 主鍵
表的主鍵可以確保在一個表中沒有重復行。盡管用戶可以建立沒有主鍵的表,但是這通常被認為是不好的習慣,應該盡量避免。
用戶的表中定義主鍵的時候需要牢記的一些要點如下所示:
- 在任意給定表上只能夠有一個主鍵。
- 表中不能有任何兩行具有相同的主鍵。
- 主鍵列不能夠為NULL。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SQL> create?user?hr_audit identified by?zyf 2 / 用戶已創建 SQL> grant?create?session,dba to?hr_audit 2 / 授權成功 SQL> create?table?another_dept as?select?* from?scott.dept; 表已創建。 SQL> alter?table?another_dept 2 add?constraint?another_dept_pk 3 primary?key(deptno); 表已更改。 |
3. 外鍵
在Oracle中,表能夠通過使用所謂的外鍵約束進行關聯。約束可以放置在一個表(子表)中的一個列或者一組列上。作為約束定義的組成部分,必須要定義子表的列去參照另一個表中(父表)的一個匹配列或者列組。
在使用外鍵的時候,需要牢記一些要點:
- 在父表中被參照的列必須是唯一鍵或者主鍵
- 外鍵可以由多個列構成。這些列被稱為復合外鍵。復合外鍵所擁有的子表列要與父表列的數量相匹配。
- 當在子表中插入記錄的時候,不論父表在相應的列中是否具有NULL值,外鍵列都可以插入NULL值。
- 外鍵可以是自參照約束,也就是說它們可以指回到相同的表。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> grant?select?on?emp to?hr_audit; 授權成功。 SQL> create?table?another_emp as?select?* from?scott.emp; 表已創建。 SQL> alter?table?another_emp 2 add?constraint?another_dept_fk foreign?key(deptno) references?another_dept(deptno) 3 / 表已更改。 |
4. 唯一性約束
唯一性約束(unique constraints)可以確保表中的各行,對于值為非NULL的給定列或者列組都具有唯一值。如同于外鍵約束,在使用唯一性約束的時候也有一些要點:
- 在表中,可以有多個行在相應的唯一性約束列中具有NULL值。由于NULL值不等于另一個NULL值,所以可以認為在唯一性約束列中具有NULL值的列唯一。
- 可以使用多個列建立唯一性約束。這些列稱為復合唯一鍵。
- 唯一鍵能夠由最多32個列構成。
- 當定義唯一鍵約束的時候,Oracle會在后臺建立一個唯一性索引來強制唯一性。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SQL> alter?table?another_emp 2 add( 3 ssn varchar2(9) 4 ); 表已更改。 SQL> alter?table?another_emp 2 add?constraint?another_emp_ssn_uk 3 unique(ssn); 表已更改。 |
5. CHECK約束
CHECK約束是用于表中積德的評估條件。如果在建立約束的時候,針對表中任何記錄的條件評估為FALSE,那么它的建立就會失敗。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | SQL> alter?table?another_emp 2 add( 3 gender varchar(10)); 表已更改。 SQL> alter?table?another_emp 2 add?constraint?ck_gender 3 check(gender in?('MALE','FEMALE')); 表已更改。 SQL> select?* from?another_emp where?sal>1500; SQL> update?another_emp set?gender='MALE'?where?mod(empno,2)=0; SQL> update?another_emp set?gender='FEMALE'?where?mod(empno,2)=1; SQL> select?empno,job,sal,gender from?another_emp where?sal>3000; EMPNO JOB SAL GENDER ---------- --------- ---------- ---------- 7839 PRESIDENT 5000 FEMALE |
3.5.2 CREATE TABLE AS SELECT
復制表結構
| 1 | CREATE?TABLE?<table_name> AS?SELECT |
注意:
當使用CREATE TABLE … AS SELECT 語法建立表的時候,支持對象(例如約束、索引和觸發器)將不會作為操作的結果建立。
3.6 數據詞典
作為數據詞典視圖的簡單示例,這是一個可以被所有數據庫用戶使用的視圖。
| 1 | SQL> describe user_tables; |
對視圖所處的空間感興趣,則如下所示:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SQL> select?table_name,tablespace_name from?user_tables order?by?table_name TABLE_NAME TABLESPACE_NAME ------------------------------ ------------------------------ ANOTHER_DEPT SYSTEM ANOTHER_EMP SYSTEM BONUS SYSTEM DEPT SYSTEM EMP SYSTEM SALGRADE SYSTEM 已選擇6行。 |
其它視圖:
- USER_TAB_COLUMNS——這個視圖不僅提供了有關表中的列的數據,而且還提供了有關屬于當前用戶的視圖和簇中的列的數據。
- USER_TAB_MODIFICATIONS——這個表包含了自從Oracle優化器最后一次對表進行分析以來,在當前用戶所擁有的表上進行的改變。
- USER_TAB_PRIVS——這個表包含了所有針對表進行的授權。
- USER_TABLES——這個視圖包含了用戶所擁有的表的元數據。
數據詞典范圍
USER_TABLES視圖只能向我們展示與當前用戶所擁有的表有關的信息。而另一方面,數據庫管理賬號卻可以使用DBA_TABLES視圖。
| 1 | SQL> select?owner,table_name from?all_tables order?by?owner,table_name; |
3.7 小結
文章根據自己理解濃縮,僅供參考。
摘自:《Oracle編程入門經典》 清華大學出版社?http://www.tup.com.cn/
from:?http://www.cnblogs.com/yongfeng/archive/2013/01/06/2846996.html
總結
以上是生活随笔為你收集整理的Oracle编程入门经典 第3章 建立以及管理用户和表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle编程入门经典 第2章 SQL
- 下一篇: Oracle编程入门经典 第4章 新9i