完整性約束的SQL定義

2021-06-02 23:47:18 字數 4013 閱讀 4351

更新資料庫時,表中不能出現不符合完整性要求的記錄,以保證為使用者提供正確、有效的資料。實現該目的最直接的方法,是在編寫資料庫應用程式時,對每個更新操作都進行完整性檢查。但這種檢查往往是複雜、重複、低效的。

sql把各種完整性約束作為資料庫模式定義的一部分,由資料庫管理系統維護,這樣即可有效防止對資料庫的意外破壞,提高了完整性檢測的效率,又減輕了程式設計人員的負擔。

sql server支援三種完整性約束:

1、實體完整性

2、參照完整性(或引用完整性)

3、使用者自定義完整性

1、實體完整性和主碼

實體完整性是通過主碼(primary key)的定義來實現的。一旦某個屬性或屬性組被定義為主碼,該主碼的每個屬性就不能為空值,並且在表中不能出現主碼值完全相同的兩個記錄。

主碼可以在create table語句中使用primary key定義。有兩種定義主碼的方法:一種是在屬性後增加關鍵字,另一種是在屬性表中加入額外的定義主碼的子句:primary key(主碼屬性名錶)。

(1)屬性後增加關鍵字定義

create table studentinfo

(studentid        char(8)    primary key,

studentname    varchar(10),

student***        bit

);(2)加入額外的定義主碼的子句

create table studentinfo

(studentid        char(8),

studentname    varchar(10),

student***        bit,

primary key(studentid)

);如果表的主碼只含有單個屬性,上面的兩種方法都可以使用。如果主碼由多個屬性組成,只能使用第二種方法。

除了主碼,sql提供了類似候選碼的說明方法,使用關鍵字unique定義(與候選碼不同的是:定義為unique的屬性可以定義為空值,但只能有乙個記錄該屬性的值為null),說明該屬性(或屬性組)的值不能重複。

乙個表中只能有乙個主碼,但可以有多個「unique」定義。

2、參照完整性(引用完整性)約束和外部碼

在更新記錄時,參照完整性保持表之間已定義的關係。參照完整性基於外來鍵與主鍵之間或外來鍵與唯一鍵之間的關係。參照完整性確保鍵值在所有表中一致。這樣的一致性要求不能引用不存在的值,如果鍵值更改了,那麼在整個資料庫中,對該鍵值的所有引用要進行一致的更改。

強制參照完整性時,sql server 禁止使用者進行下列操作:

<1>當主表中沒有關聯的記錄時,將記錄新增到相關表中。

<2>更改主表中的值並導致相關表中的記錄孤立。

<3>從主表中刪除記錄,但仍存在與該記錄匹配的相關記錄。

(1)外部碼約束的說明

說明外部碼的方法有兩種:

<1>在該屬性的說明(屬性名、型別)後直接加上關鍵字references,後跟對應表的主碼說明

格式為:references《父表名》(《屬性名》)

說明relationinfo表中studentid為外部碼,參照關係為studentinfo。

create table relationinfo

(relationid    int identity(1, 1),

studentid    char(8) references studentinfo(studentid),

departid     char(4)    

);<2>在create table 語句的屬性清單後,加上外部碼的說明子句

格式為:foreign (《屬性名錶》)references《父表名》(《屬性名錶》)

create table relationinfo

(relationid    int identity(1, 1),

studentid    char(8) ,

departid     char(4) ,

foreign key (studentid) references studentinfo(studentid)   

);(2)參照完整性約束的實現策略

當使用者的操作違反了上述規則時,sql 提供了兩種可選方案供資料庫實現者使用:restrict(限制策略);cascade(級聯策略);

<1>限制策略

限制策略是sql的預設策略,任何違反參照完整性的更新均被系統拒絕。

<2>級聯策略

當使用者刪除或更新外來鍵所指向的鍵時,sql提供了另一種方案,即級聯策略。

通過在references子句後新增on delete 和 on update子句實現:

[ on delete ]

[ on update ]

如果沒有指定on delete 或 on update,則預設為no action。 

on delete no action

指定如果試圖刪除某行,而該行含有由其它表的現有行中的外來鍵所引用的鍵,則產生錯誤並回滾 delete。

on update no action

指定如果試圖更新某行中的鍵值,而該行含有由其它表的現有行中的外來鍵所引用的鍵,則產生錯誤並回滾 update。

cascade 允許在表間級聯鍵值的刪除或更新操作,這些表的外來鍵關係可追溯到執行修改的表。不能為任何具有 timestamp 列的外來鍵和主鍵指定 cascade。

on delete cascade

指定如果試圖刪除某行,而該行含有由其它表的現有行中的外來鍵所引用的鍵,則也將刪除所有包含那些外來鍵的行。如果在目標表上也定義了級聯引用操作,則對從那些表中刪除的行同樣採取指定的級聯操作。

on update cascade

指定如果試圖更新某行中的鍵值,而該行的鍵值由其它表的現有行中的外來鍵所引用,則所有外鍵值也將更新成為該鍵指定的新值。如果在目標表上也定義了級聯引用操作,則對在那些表中更新的鍵值同樣採取指定的級聯操作。

3、使用者自定義完整性約束

sql提供非空約束、對屬性的check約束、對元組的check約束、觸發器等來實現使用者的完整性要求。

<1>基於屬性的check約束

使用check(檢查)子句可保證屬性值滿足某些前提條件。check子句的一般格式為:

check《條件》

屬性的check約束既可跟在屬性的定義後,也可在定義語句中另增一子句加以說明。

設定studentinfo表中age值不能小於18、大於65。只需將age屬性說明為如下形式:

age int check(age >= 18 and age <= 65)

<2>基於元組的約束

create table salary

(eno char(4),

basepay decimal(7, 2),

insure decimal(7, 2),

fund decimal(7, 2),

check (insure + fund < basepay)

);上面例子中,check約束涉及到表中多個屬性,為元組約束。

約束的更新

約束與資料庫中的表、檢視等一樣,可以進行增加、刪除和修改的更新操作。為了更新約束,需要在定義約束是對約束進行命名,在約束前加上關鍵字constraint和該約束的名稱。

例如要說明studentinfo表中的主碼時,將其命名為pk_studentinfo_id

create table studentinfo

(studentid        char(8),

studentname    varchar(10),

student***        bit,

constraint pk_studentinfo_id  primary key(studentid)

);可以使用alter table語句來更新與屬性或表有關的約束。

(1)刪除約束:

alter table drop constraint 約束名

(2)增加約束

alter table add constraint 約束名 約束定義

SQL完整性約束

完整性約束保證授權使用者對資料庫所做的修改不會破壞資料的一致性。not null宣告禁止在該屬性上插入空值。任何可能導致向乙個宣告為not null的屬性插入空值的資料都會產生錯誤診斷資訊。unique aj 1 aj 2 aj m unique宣告指出aj 1 aj 2 aj m 形成了乙個候選碼...

SQL完整性約束

1.資料定義語句 ddl create alter drop truncate 表結構 2.資料操縱語句 dml insert delete update select 3.資料控制語句 dcl 授權 grant 收回許可權 revoke 4.失誤控制語句 tcl 開啟事務 begin transa...

完整性約束

create table student tb id int notnull 非空約束 資料不允許為空 name varchar 255 null 顯式指定允許為空 新增非空約束 alter table 表名 modify column 屬性名 屬性型別 not null alter table s...