- 論壇徽章:
- 0
|
約束是什么
約束是用來(lái)控制什么樣的值可以存儲(chǔ)在數(shù)據(jù)庫(kù)中的機(jī)制
法律是什么
法律是用來(lái)控制什么樣的行為可以發(fā)生在特定的社會(huì)環(huán)境中的機(jī)制
所以
凡是跟約束有關(guān)的
都是一種控制的思想
控制是為了規(guī)范和效率
否則
如果大家的行為都如同熱分子一樣的,那樣
就是標(biāo)準(zhǔn)的無(wú)序
Rdbms
可是關(guān)系型的核心思想
這個(gè)世界上沒有純粹的無(wú)序
約束屬于數(shù)據(jù)庫(kù)的商務(wù)邏輯的一部分
越豐富的商務(wù)邏輯代表著我們?cè)綇?fù)雜的社會(huì)流的關(guān)系,也就是越復(fù)雜的數(shù)據(jù)之間的關(guān)聯(lián)關(guān)系。
約束的種類
Unique
Referential
Check
Informational constraint
Unique 約束
就是唯一性的約束的意思
就是表明某個(gè)列的值必須是唯一的。不能有重復(fù)。
唯一性的約束可以通過create table的語(yǔ)句來(lái)達(dá)到。
唯一性約束有2個(gè)表現(xiàn)方式
1 指明是唯一的屬性
2 創(chuàng)建主鍵,也就是說, 主鍵=唯一性約束
一個(gè)表可以有多個(gè)唯一性約束,但是只能有一個(gè)主關(guān)鍵字
必須將唯一性約束的列都定義為not null,但是唯一性索引卻沒有這個(gè)必要,因?yàn)樗饕旧砭筒荒苁莕ull的。
創(chuàng)建唯一性約束
CREATE TABLE turen (
eID INT NOT NULL PRIMARY KEY,
name CHAR(30) ,
dID INT NOT NULL UNIQUE
)
增加唯一性約束
ALTER TABLE turen ADD CONSTRAINT turen_pk PRIMARY KEY (empID)
Referential Constraints
參照約束
這種約束主要是約束了表與表之間的數(shù)據(jù)的一致性和合法性
這種約束主要是用主鍵,唯一性約束,外鍵配合使用來(lái)達(dá)到參照約束的作用。
參照約束實(shí)際就是表之間的一對(duì)多的模型關(guān)系。
我們打個(gè)比方
比如一個(gè)表是部門表,里面羅列了各個(gè)部門的信息
一個(gè)表示雇員表,里面是各個(gè)雇員的信息
那么
部門表和雇員表之間就必然存在各個(gè)關(guān)系
比如
一個(gè)部門可以用多個(gè)雇員,而一個(gè)雇員只能屬于一個(gè)部門,
那么這樣的關(guān)系我們?cè)撊绾魏?jiǎn)單表達(dá)呢?
這個(gè)時(shí)候db2就有了父表,子表,主鍵,外鍵的概念。
一般來(lái)說,
外鍵是建立在行數(shù)比較多的表上。
主鍵的特性是不能為空,必須唯一。
外鍵的特性是要么為空,要么存在主鍵之中。
在這個(gè)例子中,我們?cè)诓块T表中將部門id設(shè)置為主鍵,將雇員表的部門id設(shè)置為外鍵,那么,他們之間就會(huì)存在對(duì)應(yīng)的關(guān)系了。
這就是參照約束的典型案例。
參照約束主要是表現(xiàn)在對(duì)父表或者子表的數(shù)據(jù)的插入或者刪除的時(shí)候所引發(fā)的操作。
比如我在往子表中插入雇員信息的時(shí)候我們不能插入一個(gè)部門不存在的雇員信息
也就是說一個(gè)雇員不能為一個(gè)在公司里面不存在的部門工作。
我們先看這樣的一個(gè)創(chuàng)建參照約束的例子:
CREATE TABLE dept (
dep_ID INT NOT NULL PRIMARY KEY,
dept_Name VARCHAR(30) NOT NULL,
emp_Name CHAR(15)
)
CREATE TABLE emp (
emp_ID INT NOT NULL PRIMARY KEY,
emp_name VARCHAR(30) NOT NULL,
dept_no INT REFERENCES country,
population INT
)
在第二個(gè)表中
dept_no這里,db2會(huì)自動(dòng)去將第一個(gè)表的主鍵和這個(gè)列建立主鍵和外鍵的關(guān)系。我們無(wú)需去指定特定的主鍵。
我們也可以在表創(chuàng)建好了之后通過這樣語(yǔ)句來(lái)添加參照約束
ALTER TABLE emp ADD FOREIGN KEY (emp_no) REFERENCES dept (dept_ID)
在對(duì)父表的數(shù)據(jù)的刪除上面
主要有4中子表的行為模式我們可以設(shè)置
Restrict
Noaction
Set null
Cascade
我們還是剛才的例子來(lái)說明這四種模式的特點(diǎn)。
Cascade
如果我們?cè)赿ept父表上面刪除a部,cascade就是將子表中的所有a部門的所在的行刪除。
這就是所謂的我們現(xiàn)實(shí)社會(huì)里面的部門取消,人員解散。
Set null
如果我們?cè)赿ept父表上面刪除a部,set null,就是說子表中所有的a部門的數(shù)據(jù)行中的部門值被設(shè)置為null
這就是所謂的我們現(xiàn)實(shí)社會(huì)里面的部門取消,人員等待再分配
Restrict和noaction
的特點(diǎn)基本一致
如果我們?cè)赿ept父表上面刪除a部,Restrict就是說只要子表中的a部門下面還有雇員,那么父表的中相應(yīng)的數(shù)據(jù)將被限制,無(wú)法被刪除。
這就是所謂的我們?nèi)嗣窠夥跑姷娜嗽陉嚨卦诘囊馑肌?br />
如果用戶一定要如此刪除的話
就需要先去子表中將相應(yīng)的數(shù)據(jù)行刪除,然后才能在父表中刪除數(shù)據(jù)。
Check constraint
檢查約束實(shí)際就是對(duì)特定的表而言的。
也就是將特定表的特定的列的數(shù)據(jù)進(jìn)行數(shù)據(jù)范圍規(guī)定和限定
每次我們數(shù)據(jù)處理的時(shí)候
都需要對(duì)該列的數(shù)據(jù)進(jìn)行檢查
這樣的約束可以在創(chuàng)建表的時(shí)候來(lái)創(chuàng)建
比如
CREATE TABLE turen (
ID INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
sex CHAR(1) NOT NULL
CONSTRAINT sex_check_const CHECK (sex in ('M ', 'F '))
)
也可以通過alter table 的方式來(lái)添加Check constraint
ALTER TABLE turen
ADD CONSTRAINT sex_check_const CHECK (sex in ('M ', 'F '))
大家可以看見了
就是對(duì)sex_check_const進(jìn)行限制
性別就是雌或者雄
不能有其他的
Informational constraint
信息約束
在db2v8以前
一旦約束創(chuàng)建了
那么這些約束就是每次都是必須作用。
在db2v8以后
這種情況發(fā)生了變化
主要是出來(lái)了一些巨無(wú)霸的應(yīng)用軟件
如
Sap
People soft
Siebel
等等
他們這些軟件自己就直接在代碼里面就直接將各種約束寫在了code之中。
所以
如果這個(gè)時(shí)候db2中,將約束機(jī)制停止的話,那么db2的工作效率無(wú)疑會(huì)有所提高。
這個(gè)時(shí)候,就是Informational constraint的意義了。
Informational constraint
有四種模式
ENFORCED
就是默認(rèn)值
每次必用,始終運(yùn)行
NOT ENFORCED
Db2停止自己的約束的運(yùn)轉(zhuǎn)和檢查
ENABLE QUERY OPTIMIZATION
將約束的因素考慮進(jìn)優(yōu)化器的計(jì)算
DISABLE QUERY OPTIMIZATION
不計(jì)算約束的優(yōu)化器的因素的計(jì)算
創(chuàng)建Informational constraint
CREATE TABLE turen (
ID INT NOT NULL PRIMARY KEY,
name VARCHAR(30) NOT NULL,
sex CHAR(1) NOT NULL
CONSTRAINT sex_check_const CHECK (sex in ('M ', 'F '))
NOT ENFORCED
)
原文鏈接: http://www.ituren.org.cn/html/jishusuibi/200809/17-128.html |
|