列級別約束條件

2021-06-28 09:54:10 字數 4539 閱讀 4222

約束 關聯式資料庫中二維表的每一列資料除了需要指定資料型別,有時還需要指定一些約束條件,來限制該列能夠儲存哪些資料。關聯式資料庫中主要存在五種約束(constraint):非空、唯

一、主鍵、外來鍵、檢查。

約束有兩個級別:列級別和表級別。如果某個約束只對某個列有限制,就是列級別約束,如果某個約束與多個字段相關,則需要定義成表級別約束。

3.12.1 非空約束

非空(not null)約束表示某個欄位中不允許出現空值(null),就規定這個字段使用非空約束,它是乙個列級別約束。其定義方式為:

欄位名稱 資料型別 not null

3.12.2 唯一約束

某個欄位中不允許出現重複值,就規定這個字段使用唯一(unique)約束,同樣它也是乙個列級別的約束。需要注意的是,從 db2 v9 開始,唯一約束同時也要求非空,即定義了某個字段唯一,則該列當中既不能出現重複值,也不能出現空值。其定義方式為:

欄位名稱 資料型別 unique

3.12.3 主碼約束

主碼(primary key)約束又稱為主鍵約束,是乙個或者多個欄位的組合,關聯式資料庫要求在一張表中,不能出現完全相同的兩行,通常主鍵就是能夠用於區分不同記錄的字段或者字段組合。在實際專案中,每張表往往會定義乙個編號欄位來作為主碼。

主碼要求同時滿足非空和唯一的條件,如果主碼是由多個字段組合構成的,每個欄位中都不能出現空值,這些欄位的組合不能重複。

如果單獨乙個字段作為主碼,它既可以定義成列級別約束,也可以定義成表級別約束。如果是多個字段組合作為主碼,必須定義成表級別約束。

列級別主碼的定義方式為:

欄位名稱 資料型別 not null primary key

需要注意的是,在定義主碼之前必須指定該字段為非空的。

表級別主碼的定義方式為:

primary key( 字段列表 )

3.12.4 外碼約束

外碼(foreign key)約束又稱為外來鍵約束,通常是定義兩張表之間的關聯的。相關聯的兩張表一張作為主表,一張作為從表,從表中有乙個或者多個字段參照主表中相應的字段,也就是說,從表中這些字段當中只能出現主表中出現過的值(或者是空值),不能出現其他沒有出現過的值。下面通過乙個例子來講解外碼的建立。

例 3‑19 外碼約束。

建立兩張表,一張為系別表 department,包括編號(deptno)和系名(deptname)兩個字段,一張為學生表 student,包括學號(stuno)、姓名(name)、性別(***)和系別(deptno),其中學生表的系別字段要參照系別表,同時要求當係別表中某行記錄刪除時,自動刪除學生表中該系的所有學生。

create table department ( deptno char(10) not null primary key, deptname varchar(20) not null ) create table student ( stuno char(11) not null primary key, name varchar(8) not null, *** char(2), deptno char(10), foreign key(deptno) references department(deptno) on delete cascade )

在從表 student 建立的最後一句中,on delete cascade 子句指的是當主表中的資料刪除時,從表中對應的資料一起被級聯刪除。此處還可以寫成 on delete set null,表示主表資料刪除時,從表對應資料設定為空值,其他的寫法請參見資訊中心。

關於外碼的建立,有三點需要注意:一是必須先定義主表,再定義從表;二是從表所參照的字段在主表中必須是主碼或者候選碼(有唯一約束的字段);三是從表中對應欄位的資料型別必須與主表中的相同,但欄位名稱並不要求相同。

3.12.5 檢查約束

如果要求某個欄位在某個範圍內取值,就需要使用檢查(check)約束,它可以是列級別的約束,語法為:

欄位名稱 資料型別 check( 約束條件 )

也可以是表級別的約束,語法為:

check( 約束條件 )

3.12.6 其他約束

除了以上五種標準 sql 定義的約束,db2 中還擴充套件了一些約束,比較常用的有預設值和標識列。

預設值(default),又叫做預設值,用於指定某個欄位的預設值,當插入資料的時候沒有給出值,將使用這個預設值進行填充,它是乙個列級別約束,其語法為:

欄位名稱 資料型別 default < 預設值 >

標識列(identity),定義在數值型字段上的一種約束,用它可以在插入一行新記錄的時候生成乙個按照一定規律自動增長的值。

標識列可以有兩種生成方式:generated always 和 generated by default,下面詳細介紹這兩種方式的區別。

1 . generated always

這種生成方式總是由 db2 生成值,不能在應用程式或者 sql 語句中直接提供值。

例 3‑20 generated always 生成的標識列。

下例說明了通過 generated always 生成的標識列如何使用。執行下例之前,首先要把自動提交的選項關閉(db2 +c)。

create table inventory1 ( partno integer generated always as identity (start with 100, increment by 1), description char(20) ); insert into inventory1 values (default,'door'); ---> 成功,插入了 100,door insert into inventory1 (description) values ('hinge'); ---> 成功,插入了 101,hinge insert into inventory1 values (102,'window'); ---> 失敗 ,partno 不能插入值 commit; insert into inventory1 (description) values ('lock'); ---> 成功,插入了 102,lock rollback; ---> 取消了前一步操作 insert into inventory1 (description) values ('frame'); ---> 成功,插入了 103,frame commit; select * from inventory1; 100 door 101 hinge 103 frame

2 . generated by default

採用這種方式,如果使用者沒有給標識列提供值,db2 將自動生成乙個值;如果使用者給標識列提供了值,db2 將不再生成值,而是直接使用使用者提供的值。使用這種方式,不能保證生成的值是唯一的。

例 3‑21 generated by default 生成的標識列。

下例說明了通過 generated by default 生成的標識列如何使用。執行下例之前,同樣需要首先把自動提交的選項關閉(db2 +c)。

create table inventory2 ( partno integer generated by default as identity (start with 100, increment by 1), description char(20) ); insert into inventory2 values (default,'door'); ---> 成功,插入了 100,door insert into inventory2 (description) values ('hinge'); ---> 成功,插入了 101,hinge insert into inventory2 values (102,'window'); ---> 成功,插入了 102,window commit; insert into inventory2 (description) values (102,'lock'); ---> 成功,插入了 102,lock insert into inventory2 (description) values ('lock'); ---> 成功,插入了 102,lock rollback; ---> 取消了前一步操作 insert into inventory2 (description) values ('frame'); ---> 成功,插入了 103,frame commit; select * from inventory2; 100 door 101 hinge 102 window 103 frame

可以使用 identity_val_local() 函式來獲取當前生成列的生成值,它主要是用於在從表中給對應的列插入資料,例如:

insert into parent_table (pk_id, ... ) values (default, ...); insert into child1_table (...,fk_id,...) values (....,identity_val_local(),...); insert into child2_table (...,fk_id,...) values (....,identity_val_local(),...);

其中 parent_table 為主表,pk_id 為主碼,是標識列。而 child1_table 和 child2_table 是參照於主表的從表,其中 fk_id 是外碼,參照主表中的主碼。由於外碼的取值要在主碼所參照的主表中出現,而主表中的主碼是由標識列自動生成的,要想知道當前生成的值就需要使用 identity_val_lacal() 函式。

MySQL 約束條件

1 非空約束 not null規定某個欄位在插入的時候不能有null,標誌位非空的時候插入的時候必須給值,不然會報錯 2 唯一約束 unique規定某個字段在整個這一列中是唯一 3 主鍵 非空且唯一是主要特徵。主鍵可以唯一標識一行資料 可以從多行資料中定位到該資料 但是唯一標識一行資料的字段 或字段...

約束條件 CONSTRAINTS

檢視某個表的約束和索引 一 定義 對錶中的資料進行限定,保證資料的正確性 有效性 和完整性。二 分類 在建立表時,新增主鍵 id int primary key,給id 新增主鍵約束 建立完錶後,新增主鍵 自動增長 id int primary key auto increment,給主鍵id 新增...

MySQL 列屬性(表的約束條件)

表的建立create table 表名 列名a 資料型別 資料長度 列級約束條件,列名b 資料型別 資料長度 列級約束條件,列名c 資料型別 資料長度 列級約束條件,表級約束條件 約束條件涉及到多個屬性列,則須定義在表級上 create table runoob tbl runoob id int ...