對於系統中已有的索引,我們可以通過下面兩個系統視圖(user_indexes和user_ind_columns)來查看其具體內容,比如它們屬於哪個表,屬於哪個列,有哪些參數等等。
User_indexes:系統視圖存儲諸如索引名稱和索引是否惟壹等信息。
User_ind_column:系統視圖存儲索引名稱、對應的表和列等。
查看索引的數量和類別:
SQL & gtselect * from user _ indexes where table = ' table name ';
查看索引的索引字段:
SQL & gtselect * from user_ind_columns其中index _ name = upper(& amp;index _ name’);
我們可以通過類似下面的語句來看壹個表的索引的基本情況:
select用戶_索引_列名,用戶_索引_列名,
user _ ind _ columns . column _ position,user _ indexes.uniqueness
從用戶索引列,用戶索引
其中,用戶索引列.索引名稱=用戶索引.索引名稱
和user _ ind _ columns。table _ name = '要查詢的表的名稱';
通過這條SQL語句,我們可以看到壹個表的具體索引。如果想進壹步探究這個表的索引,應該去user_indexes看看這個索引的基本情況。
完整性約束
DBA_CONSTRAINTS、ALL_CONSTRAINTS和USER _ CONSTRAINST顯示關於約束的壹般信息。
DBA _ CONS _列、ALL _ CONS _列和USER _ CONS _列顯示列的相關約束的壹般信息。
ALL _ CONS _列視圖和DBA _ CONS _列視圖與USER _ CONS _列具有相同的列定義。
ALL _ CONS _列視圖可以顯示用戶可以訪問的所有表上的約束的列信息,而不管所有者是誰。
DBA _ CONS _列視圖列出了整個數據庫的列級約束信息。
用戶_ CONS _列
user_constraints和user_cons_columns表的功能和關系
User_constraints:表約束的視圖,描述約束類型(constraint_type)是什麽,以及它屬於哪些表(table_name)。如果約束類型是R(外鍵),那麽r_constraint_name字段將主鍵約束名存儲在被引用的主表中。
User_cons_columns:是表約束字段的視圖,表示表中與約束相關的列涉及哪些約束。這些約束包括主鍵約束、外鍵約束和索引約束。
這兩者可以通過(所有者,約束名稱,表名稱)相關聯:
挑選
a .外鍵所有者所有者,
A.table_name外鍵表
Substr (c.column _ name,1,127)外鍵列,
主密鑰所有者,
B.table_name主鍵表,
Substr (d.column _ name,1,127)主鍵列。
從
用戶約束a,
用戶約束b,
用戶_成員_列c,
用戶_成員_列d
在哪裏
a.r _約束條件名稱=b .約束條件名稱
並且a.constraint_type='R '
並且b.constraint_type='P '
並且a.r_owner=b.owner
並且a .約束名稱=c .約束名稱
並且b .約束名稱=d .約束名稱
和a .所有者=c .所有者
並且a .表名=c .表名
b .所有者=d .所有者
並且b .表名=d .表名
數據字典表列描述:
desc用戶_約束
命名註釋
- -
所有者表的所有者
與約束定義關聯的約束名稱
約束定義的類型
TABLE_NAME與具有約束定義的表相關聯的名稱
用於表檢查的搜索條件的搜索條件文本
R_OWNER引用約束中使用的表的所有者
R_CONSTRAINT_NAME被引用表的唯壹約束定義的名稱
DELETE_RULE引用約束的刪除規則
狀態強制約束的狀態-啟用或禁用
可推遲是約束條件可推遲-可推遲或不可推遲
DEFERRED是默認情況下延遲的約束——延遲或立即
該約束系統經過驗證了嗎?-驗證或未驗證
約束名稱是系統生成的嗎?-生成的名稱或用戶名
創建此約束應該會產生ORA-02436。在公元2000年之前重寫。
依賴如果設置,此標誌將用於優化器
LAST _更改上次啟用或禁用此列的日期
INDEX_OWNER約束使用的索引的所有者
INDEX_NAME約束使用的索引
無效的
視圖相關
desc用戶欄;
命名註釋
- - - - -
所有者約束定義的所有者
約束名稱與約束定義相關聯的名稱
TABLE_NAME與具有約束定義的表相關聯的名稱
COLUMN_NAME與約束定義中指定的對象列的列或屬性關聯的名稱
定位定義中列或屬性的原始位置
ORACLE的索引和約束詳細信息數據庫
Oracle的約束
*如果壹個約束只作用於單個字段,可以在字段級定義,也可以在表級定義,但是如果壹個約束作用於多個字段,
必須在表級別定義約束。
*定義約束時,可以通過CONSTRAINT關鍵字命名約束。如果未指定,ORACLE將自動為該約束建立壹個默認名稱。
定義主鍵約束(單個字段)
創建表employees (empno number(5)主鍵、...)
指定約束名稱
創建表employees (empno number(5)約束emp_pk主鍵,...)
定義主鍵約束(多個字段,在表級別定義約束)
創建表員工
(empno編號(5)、
deptno編號(3)不為空,
約束emp_pk主鍵(empno,deptno)
使用索引表空間indx
存儲(初始64K
下壹個64K
)
)
ORACLE將自動為具有主鍵約束的字段(主鍵代碼字段)創建唯壹索引和非空約束,在定義主鍵約束時可以將其用作索引。
指定存儲位置和存儲參數。
更改表員工添加主鍵(empno)
alter table employees添加約束emp_pk主鍵(empno)
alter table employees add約束emp_pk主鍵(empno,deptno)
not null約束(NOT NULL約束只能在字段級定義,在同壹個表中可以定義多個NOT NULL約束)。
alter table employees modify deptno not null/null
唯壹約束
創建表員工
(empno編號(5)、
ename varchar2(15),
電話號碼varchar2(15),
電子郵件varchar2(30)唯壹,
deptno編號(3)不為空,
約束emp_ename_phone_uk unique (ename,phone)
)
更改員工表
添加約束emp_uk unique(姓名,電話)
使用索引表空間indx
具有唯壹約束的字段不能包含重復值。您可以為壹個或多個字段定義唯壹約束,因此可以在字段級和表級定義唯壹約束。
唯壹約束的字段可以包含空值。
外鍵約束
*定義為外鍵約束的字段只能包含其他表中引用代碼字段的值或空值。
*您可以為壹個或多個字段的組合定義外鍵約束。
*定義了外鍵約束的外部代碼字段和對應的引用代碼字段可以存在於同壹個表中,這種情況稱為"自引用"。
*可以為同壹個字段同時定義外鍵約束和NOT NULL約束。
定義外鍵約束的字段稱為“外部代碼字段”,被外鍵約束引用的字段稱為“引用代碼字段”,引用代碼必須是主代碼或唯壹代碼,包含外部代碼的表稱為子表。
包含引用代碼的表稱為父表。
答:
創建表員工
(.....,
deptno編號(3)不為空,
約束emp_deptno_fk外鍵(deptno)
參考資料部
)
如果子表中的外部代碼與主表中的參考代碼同名,則可以寫成:
乙:
創建表員工
(.....,
deptno編號(3)不為空
約束emp_deptno_fk參考部門
)
註意:
在上面的例子(b)中,not null後面沒有逗號,因為這句話的約束跟在列deptno後面,屬於列定義,所以不需要指定列。例A,是壹個表定義,需要指定哪壹列,所以要加壹個逗號,可以不在列後定義,也可以寫成:
創建表員工
(empno char(4)、
deptno char(2) not null約束emp_deptno_fk引用dept,
ename varchar2(10)
)
約束的表定義只能寫到最後,然後看兩個例子:
創建表員工
(empno編號(5)、
ename varchar2(10),
deptno char(2) not null約束emp_deptno_fk引用dept,
約束emp_pk主鍵(empno,ename)
)
創建表員工
(empno編號(5)、
ename varchar2(15),
電話號碼varchar2(15),
電子郵件varchar2(30)唯壹,
deptno編號(3)不為空,
約束emp_pk主鍵(empno,ename),
約束emp_phone_uk唯壹(電話)
)
添加外鍵約束(多字段/表級別)
更改員工表
添加約束emp_jobs_fk外鍵(job,deptno)
參考職務(職務id、部門編號)
在刪除級聯時
更改外鍵約束定義的引用行為(delete cascade/delete set null/delete no action),默認為delete on action。
引用行為(刪除主表中的壹條記錄時,確定如何處理word表中的外碼字段):
刪除級聯:刪除子表中所有相關記錄。
刪除設置null:將所有相關記錄的外部代碼字段值設置為NULL。
不刪除操作:什麽都不做。
在添加約束之前,請刪除原始外鍵約束。
ALTER TABLE employees刪除約束emp _ deptno _ fk
ALTER TABLE employees ADD約束emp_deptno_fk外鍵(deptno)在刪除級聯時引用dept(deptno );
檢查約束
*表中的壹個或多個字段必須在CHECK約束的表達式中被引用,並且表達式的計算結果必須是布爾值。
*可以在表級或字段級定義。
*您可以為同壹個字段定義多個CHECK約束和NOT NULL約束。
創建表員工
(sal數(7,2)
約束emp_sal_ck1檢查(sal & gt0)
)