函數依賴:當某一列的數據必須隨着另外一列的數據改變而改變,表示第一列函數依賴與第二列.快速表示函數依賴的方式:T.x--->T.y,在關係表T中,y列函數依賴與x列。java
部分函數依賴:非主鍵的列依賴於組合主鍵的某個部分(但不是徹底依賴於組合主鍵)。數據庫
傳遞依賴:若是改變任何非主鍵的列可能形成其餘列的改變,即爲傳遞依賴。編程
傳遞函數依賴:任何非主鍵列與另外一個非主鍵列有關聯。函數
第一範式,或1NF:測試
規則一:數據列只包括具備原子性的值spa
規則二:沒有才重複的數據組rest
第二範式,或2NFblog
規則一:符合1NFci
規則二:沒有部分函數依賴性。it
第三範式,或3NF
規則一:符合2NF
規則二:沒有傳遞函數依賴性。
外鍵約束
若是表A的主關鍵字是表B中的字段,則該字段稱爲表B的外鍵,表A稱爲主表,表B稱爲從表。外鍵是用來實現參照完整性的,不一樣的外鍵約束方式將可使兩張表緊密的結合起來,特別是修改或者刪除的級聯操做將使得平常的維護工做更加輕鬆。這裏以用戶表和用戶組表爲例,這是一個典型的多對一關係,多個用戶對應於一個用戶組。
首先建立用戶組表:
create table t_group ( id int not null, name varchar(30), primary key (id));
插入兩條記錄:
insert into t_group values (1, 'Group1'),(2, 'Group2');
下面建立用戶表,分別以不一樣的約束方式建立外鍵引用關係:
一、級聯(cascade)方式
create table t_user ( id int not null, name varchar(30), groupid int, primary key (id), foreign key (groupid) references t_group(id) on delete cascade on update cascade);
測試
insert into t_user values (1, 'qianxin', 1);//能夠插入 insert into t_user values (2, 'yiyu', 2);//能夠插入 insert into t_user values (3, 'dai', 3);//錯誤,沒法插入,用戶組3不存在,與參照完整性約束不符 delete from t_group where id=2;//致使t_user中的2記錄級聯刪除 update t_group set id=2 where id=1;//致使t_user中的1記錄的groupid級聯修改成2
二、置空(set null)方式
create table t_user ( id int not null, name varchar(30), groupid int, primary key (id), foreign key (groupid) references t_group(id) on delete set null on update set null);
測試:
//參照完整性測試 insert into t_user values (1, 'qianxin', 1); --能夠插入 insert into t_user values (2, 'yiyu', 2); --能夠插入 insert into t_user values (3, 'dai', 3); --錯誤,沒法插入,用戶組3不存在,與參照完整性約束不符 //約束方式測試 delete from t_group where id=2;//致使t_user中的2記錄的groupid被設置爲NULL update t_group set id=2 where id=1;//致使t_user中的1記錄的groupid被設置爲NULL
三、禁止(no action / restrict)方式
create table t_user ( id int not null,name varchar(30), groupid int, primary key (id), foreign key (groupid) references t_group(id) on delete no action on update no action);
測試:
insert into t_user values (1, 'qianxin', 1);//能夠插入 insert into t_user values (2, 'yiyu', 2);//能夠插入 insert into t_user values (3, 'dai', 3); //錯誤,沒法插入,用戶組3不存在,與參照完整性約delete from t_group where id=2; //錯誤,從表中有相關引用,所以主表中沒法刪除 update t_group set id=2 where id=1; //錯誤,從表中有相關引用,所以主表中沒法修改
更新數據庫時,表中不能出現不符合完整性要求的記錄,以保證爲用戶提供正確、有效的數據。實現該目的最直接的方法,是在編寫數據庫應用程序時,對每一個更新操做都進行完整性檢查。但這種檢查每每是複雜、重複、低效的。SQL把各類完整性約束做爲數據庫模式定義的一部分,由數據庫管理系統維護,這樣便可有效防止對數據庫的意外破壞,提升了完整性檢測的效率,又減輕了編程人員的負擔。
SQL Server支持三種完整性約束:
1.實體完整性和主碼
實體完整性是經過主碼(PRIMARY KEY)的定義來實現的。一旦某個屬性或屬性組被定義爲主碼,該主碼的每一個屬性就不能爲空值,而且在表中不能出現主碼值徹底相同的兩個記錄。主碼能夠在CREATE TABLE語句中使用PRIMARY KEY定義。有兩種定義主碼的方法:一種是在屬性後增長關鍵字PRIMARY KEY,另外一種是在屬性表中加入額外的定義主碼的子句:PRIMARY KEY(主碼屬性名錶)。若是表的主碼只含有單個屬性,上面的兩種方法均可以使用。若是主碼由多個屬性組成,只能使用第二種方法。除了主碼,SQL提供了相似候選碼的說明方法,使用關鍵字UNIQUE定義(與候選碼不一樣的是:定義爲UNIQUE的屬性能夠定義爲空值,但只能有一個記錄該屬性的值爲NULL),說明該屬性(或屬性組)的值不能重複。一個表中只能有一個主碼,但能夠有多個「UNIQUE」定義。
SQL提供非空約束、對屬性的CHECK約束、對元組的CHECK約束、觸發器等來實現用戶的完整性要求。
3.1基於屬性的CHECK約束(MYSQL暫時不支持check功能)
使用CHECK(檢查)子句可保證屬性值知足某些前提條件。CHECK子句的通常格式爲:
CHECK<條件>
屬性的CHECK約束既可跟在屬性的定義後,也可在定義語句中另增一子句加以說明。設定StudentInfo表中age值不能小於1八、大於65。只需將age屬性說明爲以下形式:
age int CHECK(age >= 18 and age <= 65)
3.2基於元組的約束
CREATE TABLE salary( Eno char(4), Basepay decimal(7, 2), Insure decimal(7, 2), Fund decimal(7, 2), CHECK (Insure + Fund < Basepay) );
上面例子中,CHECK約束涉及到表中多個屬性,爲元組約束。
3.3約束的更新
約束與數據庫中的表、視圖等同樣,能夠進行增長、刪除和修改的更新操做。爲了更新約束,須要在定義約束是對約束進行命名,在約束前加上關鍵字CONSTRAINT和該約束的名稱。例如要說明StudentInfo表中的主碼時,將其命名爲PK_StudentInfo_ID.
CREATE TABLE StudentInfo( StudentID char(8), StudentName varchar(10), StudentSex bit, CONSTRAINT PK_StudentInfo_ID PRIMARY KEY(StudentID) );
可使用ALTER TABLE語句來更新與屬性或表有關的約束.
//刪除約束: ALTER TABLE DROP CONSTRAINT 約束名 //增長約束 ALTER TABLE ADD CONSTRAINT 約束名 約束定義