範式

  函數依賴:當某一列的數據必須隨着另外一列的數據改變而改變,表示第一列函數依賴與第二列.快速表示函數依賴的方式: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. 實體完整性;
  2. 參照完整性(或引用完整性);
  3. 用戶自定義完整性

1.實體完整性和主碼

  實體完整性是經過主碼(PRIMARY KEY)的定義來實現的。一旦某個屬性或屬性組被定義爲主碼,該主碼的每一個屬性就不能爲空值,而且在表中不能出現主碼值徹底相同的兩個記錄。主碼能夠在CREATE TABLE語句中使用PRIMARY KEY定義。有兩種定義主碼的方法:一種是在屬性後增長關鍵字PRIMARY KEY,另外一種是在屬性表中加入額外的定義主碼的子句:PRIMARY KEY(主碼屬性名錶)。若是表的主碼只含有單個屬性,上面的兩種方法均可以使用。若是主碼由多個屬性組成,只能使用第二種方法。除了主碼,SQL提供了相似候選碼的說明方法,使用關鍵字UNIQUE定義(與候選碼不一樣的是:定義爲UNIQUE的屬性能夠定義爲空值,但只能有一個記錄該屬性的值爲NULL),說明該屬性(或屬性組)的值不能重複。一個表中只能有一個主碼,但能夠有多個「UNIQUE」定義。

3.用戶自定義完整性約束

  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 約束名 約束定義
相關文章
相關標籤/搜索