1. 程式人生 > >約束、索引、三範式

約束、索引、三範式

varchar 表達 for 設立 null cas left 過程 自定義

1.約束的定義:

  約束(constraint):在建表時,為某些列添加一些特定的規則,這些規則稱為約束。約束是在表上強制執行的數據校驗規則保證數據庫的數據滿足某種用戶的要求。添加約束之後,再往表中(插入、更新)數據時,如果數據不滿足約束,則該條語句不能執行。

2.約束的分類:

2.1 非空約束 not null

非空約束確保字段值不允許為空
非空約束只能在字段級定義

-- not null 非空約束
--添加了 not null的列的值不能為null,但可以是空格
create table test01( 
empno number(4) ,
ename varchar2
(10) not null )

2.2 唯一約束 unique

唯一性約束條件確保所在的字段或者字段組合不出現重復值
唯一性約束條件的字段允許出現空值

--unique 唯一鍵約束
--添加了unique 約束的列的值是唯一的,不能出現重復的值,但可以有多個null值
create table test02 (
empno number(4) unique,
 ename varchar2(10)
 );
--非空且唯一
--允許同時添加not null和unique表示不能重復並且不能為null
create table test03 (
empno number
(4) not null unique,e name varchar2(10) );

2.3 自定義檢查約束 check

check約束用於對一個屬性的值加以限制。
在check中定義檢查的條件表達式,在對數據進行插入或修改需要符合設置的條件。

--check 自定義檢查約束
--在插入或修改數據時,值要符合check中定義的條件
create table test04(
empno number(4),
ename varchar2(10),
age number(3) check(age>0 and age<200),
gender varchar2(3) check
(gender= or gender=) )

2.4 主鍵約束 primary key

主鍵約束是數據庫中最重要的一種約束。在關系中,主鍵值不可為空,也不允許出現重復,即關系要滿足實體完整性規則。
– 主鍵從功能上看相當於非空且唯一
– 一個表中叧允許一個主鍵
– 主鍵是表中能夠唯一確定一個行數據的字段
– 主鍵字段可以是單字段戒者是多字段的組合(聯合主鍵)
– Oracle為主鍵創建對應的唯一性索引

--主鍵約束從形式可看成類非空且唯一
create table test05(
empno number(4) primary key,
ename varchar2(10)
)
--聯合主鍵
--一張表只有一個主鍵,但可以選擇多個列,作為聯合主鍵
create table test06(
empno number(4),
ename varchar2(10),
constraint pk_no_name primary key(empno,ename)
--在列中添加約束可以不給約束命名,沒有命名系統會自動命名
--在表中添加約束就需要手動命名
)

2.5 外鍵約束 foreign key


外鍵是表中的一個列,它的值依賴於另一張表的主鍵或者唯一鍵被依賴的表稱為主表,

存在外鍵的表稱為從表外鍵的值必須是主表(指定的)主鍵或者唯一鍵中列出

註:
對於主表的刪除和修改主鍵值的操作,會對依賴關系產生影響,以刪除為例:當要刪除主表的某個主鍵值(依賴的,那麽對依賴的影
響可采取下列3種做法:
1. RESTRICT方式(默認,無法刪除):只有當從表中沒有一個外鍵值與要刪除的主表中主鍵值相對應時,才可執行刪除操作。
2. CASCADE方式(聯級刪除):將從表中所有外鍵值與主表中要刪除的主鍵值相對應的記錄一起刪除
3. SET NULL方式(設置為空):將從表中所有與主表中被刪除的主鍵值相對應的外鍵值設為空值

添加外鍵約束語法:
外鍵列 REFERENCES 表名(主鍵列)
[ON DELETE [CASCADE|SET NULL]] 如省略on短語,默認按第一種處理方式。

--主表
create table t_dept(
deptno number(2) primary key,
dname varchar2(12)
)

--從表
create table t_emp(
empno number(4),
ename varchar2(10),
--添加外鍵,指定主鍵刪除處理方式
deptno number(2) references t_dept(deptno) on delete set null
) 

3.添加和修改約束

可增加或刪除約束,但不能直接修改
語法:
增加
alter table 表名 add constraint 約束名 unique(列名)
刪除
alter table 表名 drop constraint 約束名 [cascade] (加了cascade就為聯級刪除)


4.索引

4.1 概念:

索引是為了加快對數據的搜索速度而設立的。類似於一本書的目錄,數據庫對表數據進行查詢時可以通過索引快速定位到數據。索引是非顯示的,在創建之後不會再用到,但查詢數據時索引會自動起作用。

4.2 索引創建的兩種情況:

1. 自動: 當在表上定義一個PRIMARY KEY 或者UNIQUE 約束條件時,Oracle數據庫自動創建一個對應的唯一索引。
2. 手動: 手動在某個或多個列上創建索引以加速查詢
語法:CREATE INDEX index 索引名 ON 表名 (列1[,列2]...);
在多個列上創建索引時,需要對多個列同時進行查詢,索引才會起作用

4.3 使用索引需註意:

1. 索引提高檢索操作的性能,但降低數據插入、修改和刪除的性能。在執行這些操作時,DBMS(數據庫管理系統)必須動態地更新索引。
2.索引數據可能需要占用大量空間
3.經常出現重復的數據不適合使用索引
4.在多個列上創建索引時,需要對多個列同時進行查詢,索引才會起作用

4.4 刪除索引:

語法: drop index 索引名

5. 數據庫設計三範式:

數據庫的設計主要包含了設計表結構和表之間的聯系,在設計的過程中,應該遵守三範式:
第一範式:數據庫表中的每一個列都必須是不可分割的基礎數據項。例如:“地址”應該拆分成省份、城市、詳細地址等多個部分進行存儲
第二範式:確保表中每列都與主鍵相關
第三範式:一個數據庫表中不能包含已在其它表中已包含的非主關鍵字信息。

約束、索引、三範式