MySQL之完整性約束

2021-08-03 21:45:26 字數 4276 閱讀 6970

我們知道,一種資料模型必須包含三個基本的部分:

作為資料庫的一種資料模型,關係模型提供了一組完整性規則或限制。完整性約束用於確定關聯式資料庫裡資料的準確性和一致性。

在關係型資料庫裡,完整性約束包括域完整性、實體完整性、引用完整性以及使用者定義完整性。

域完整性,是指給定列的取值範圍(即輸入的有效性),比如性別取值應為男或女。

強制域有效性的方法有:限制型別(通過資料型別)、格式(通過 check 約束和規則)或可能值的範圍(通過 foreign key 約束、check 約束、default 定義、not null 定義和規則)。

實體完整性,是指使用主鍵來唯一地標識乙個實體。

在關聯式資料庫中,一條記錄代表乙個實體。而實體是可以相互區分、識別的,也即它們應具有某種唯一性標識(該標識不能取相同的值,也不能為空)。

實體完整性強制表的識別符號列或主鍵的完整性(通過索引、unique 約束、primary key 約束或 identity 屬性)。

引用完整性,就是定義外來鍵與主鍵之間的引用規則。

假設有兩個關係:

student (stuid, name, ***, age, classid);

class (classid, amount, teachername);

其中 cl

assi

d  是關係 st

uden

t  的外來鍵,它引用了關係 cl

ass  裡的 cl

assi

d 。這個外來鍵確保了關係 st

uden

t  裡的每個 cl

assi

d  都在關係 cl

ass  中有對應的 cl

assi

d 。在輸入或刪除記錄時,引用完整性保持表之間已定義的關係:

引用完整性基於外來鍵與主鍵之間或外來鍵與唯一鍵之間的關係(通過 foreign key 和 check 約束)。引用完整性確保鍵值在所有表中一致。這樣的一致性要求不能引用不存在的值,如果鍵值更改了,那麼在整個資料庫中,對該鍵值的所有引用要進行一致的更改。

使用者定義完整性讓使用者可以定義不屬於其它任何完整性分類的特定業務規則。所有的完整性型別都支援使用者定義完整性(create table 中的所有列級和表級約束、儲存過程和觸發器)。

不同的資料庫產品對完整性約束的支援程度不一樣,但基本的完整性約束都是支援的。相信以後會越來越完善。

主鍵,又稱主碼,是表中一列或多列的組合,能夠唯一地標識表中的一條記錄。主鍵約束(primary key constraint)要求主鍵列的資料唯一,且不允許為空。

在建立表的過程中新增乙個欄位的主鍵約束:

create

table employees (

id int(11) auto_increment primary

key,

name varchar(20) not

null,

deptid int(3) not

null,

salary float

notnull

);

create

table employees (

id int(11) auto_increment,

name varchar(20) not

null,

deptid int(3) not

null,

salary float

notnull,

primary

key(id)

);

注意:auto_increment表示自增,預設初始值為1。

也可以使用多個欄位的組合作為主鍵:

create

table employees (

name varchar(20) not

null,

deptid int(3) not

null,

salary float

notnull,

primary

key(name, deptid)

);

另外,也可以在建表之後使用alter新增主鍵約束:

create

table employees (

name varchar(20) not

null,

deptid int(3) not

null,

salary float

notnull,

);alter

table employees add

constraint emp_pk primary

key(name, deptid);

唯一性約束(unique constraint)要求表裡某個欄位的值在每條記錄裡都是唯一的,這一點與主鍵類似。宣告為unique的字段允許為空,但只能出現乙個空值。

create

table department(

deptid int(3) primary

key,

name varchar(20) unique,

location varchar(50)

);

create

table department(

deptid int(3) primary

key,

name varchar(20),

location varchar(50),

unique(name)

);

外來鍵(foreign key):首先它是表中的乙個字段,它可以不是本表的主鍵,但必須對應另外乙個表的主鍵。外來鍵可以為空值,若不為空值,則每乙個外鍵值必須等於另乙個表中主鍵的某個值。

外來鍵約束是確保表與表之間引用完整性的主要機制。乙個表可以有乙個或多個外來鍵。通常,我們把外來鍵所在的表稱為子表,外來鍵所引用的表稱為父表。

create

table employees(

id int(11) primary

key,

name varchar(20) not

null,

deptid int(3) not

null,

salary float

notnull,

constraint emp_fk foreign

key(deptid) references department(deptid)

);

或者

alter

table employees add

constraint emp_fk foreign

key(deptid) references department(deptid);

非空約束(not null constraint)指字段的值不能為空。對於使用了 not null 約束的字段,如果使用者在新增資料時沒有指定值,資料庫系統會報錯。

create

table employees (

id int(11) primary

key,

name varchar(20),

deptid int(3),

salary float

);

新增非空約束:

alter

table employees modify name varchar(20) not

null;

取消非空,並新增預設值:

alter

table employees modify name varchar(20) default

'abc';

檢查約束(check constraint)用於檢查輸入到特定欄位的資料的有效性。mysql不支援check約束,但可以使用check約束,而沒有任何效果。

create

table employees (

id int(11) primary

key,

name varchar(20),

age int(3),

constraint age_chk check(age>18)

);

上面 check 約束要求 age 必須大於18,但插入資料時卻沒有起到任何作用。

MySQL完整性約束

create database adrui show databases use adrui not null 非空約束,插入資料該欄位不能為空 primary key 主鍵約束 主鍵約束相當於非空約束 唯一約束,auto increment是mysql擴充套件的字段值自加的約束,約束字段資料型別必...

Mysql 完整性約束

定義 完整性約束是對字段進行限制,從而符合該欄位達到我們期望的效果比如字段含有預設值,不能是null等,主要有唯 一 自增 主鍵 外來鍵約束 唯一約束 唯一約束可以有多個但索引列的值必須唯一,索引列的值允許有空值。如果能確定某個資料列將只包含彼此各不相同的值,在為這個資料列建立索引的時候就應該使用關...

完整性約束

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