MySQL數據庫高級(一)——數據完整性

MySQL數據庫高級(一)——數據完整性

1、數據完整性簡介

一、數據完整性簡介

數據冗餘是指數據庫中存在一些重複的數據,數據完整性是指數據庫中的數據可以正確反應實際狀況。
數據的完整性是指數據的可靠性和準確性,數據完整性類型有四種:
A、實體完整性:實體的完整性強制表的標識符列或主鍵的完整性(經過惟一約束,主鍵約束或標識列屬性)。
B、域完整性:限制類型(數據類型),格式(經過檢查約束和規則),可能值範圍(經過外鍵約束,檢查約束,默認值定義,非空約束和規則)。
C、引用完整性:在刪除和輸入記錄時,引用完整性保持表之間已定義的關係。引用完整性確保鍵值在全部表中一致,不能引用不存在的值.若是一個鍵。
D、自定義完整性:用戶本身定義的業務規則,好比使用觸發器實現自定義業務規則。
MySQL數據庫高級(一)——數據完整性數據庫

二、數據完整性實現方式

MySQL數據庫高級(一)——數據完整性
MySQL不支持Check約束,雖然能夠在列上添加check約束,但不起做用。ide

2、實體完整性實現

一、實體完整性的實現簡介

實體完整性的實現有兩種方式:
A、主鍵約束:一張表只能有一列設置主鍵,值必須惟一,不容許爲空,innoDB存儲引擎,主鍵就是索引。
B、惟一值約束:一張表能夠有多個列添加惟一值約束,一直容許一條記錄爲空值。
實體完整性,由主鍵和惟一性約束來實現,確保表中記錄有一列惟一標識。主鍵又分爲Primary key 和AUTO_INCREMENT PRIMARY KEY兩種。函數

二、主鍵

MySQL的主鍵名老是PRIMARY, 當建立主鍵約束時,若是表的存儲引擎是innoDB,系統默認會在所在的列和列組合上創建對應的惟一索引。
主鍵約束至關於惟一約束與非空約束的組合,主鍵約束列不容許重複,也不容許出現空值;多列組合的主鍵約束,列都不容許爲空值,而且組合的值不容許重複。每一個表最多隻容許一個主鍵,創建主鍵約束能夠在列級別建立,也能夠在表級別上建立。
A、建立表時指定主鍵
建立表時指定主鍵的方式一:3d

create table product
 (
 productID int PRIMARY KEY,
 pName VARCHAR(10),
 price DOUBLE
 )ENGINE=MyISAM default CHARSET=utf8;

建立表時指定主鍵的方式二:rest

create table product
 (
 productID int,
 pName VARCHAR(10),
 price DOUBLE,
 CONSTRAINT pk_s_productID PRIMARY KEY(productID)
 )ENGINE=MyISAM default CHARSET=utf8;

在指定主鍵的表中插入記錄時,不容許插入重複的ID,若是不指定主鍵的值,默認爲0。
MyISAM類型的存儲引擎不會在主鍵列上建立索引,表中記錄的存儲順序與插入順序相同。
MySQL數據庫高級(一)——數據完整性
InnoDB存儲引擎會自動在主鍵列上建立索引,插入的記錄會根據主鍵的值的順序排放。
alter table product ENGINE=InnoDB;
MySQL數據庫高級(一)——數據完整性
B、增長主鍵
alter table TStudent add primary key(studentid);
C、刪除主鍵
alter table TStudent drop primary key;code

三、自增主鍵

AUTO_INCREMENT PRIMARY KEY
若是不指定主鍵值,會自動在現有主鍵值的最大值上自動增長1做爲新記錄的主鍵,主鍵值默認從1開始。能夠在數據數據類型整數型的列上添加自增主鍵。
MySQL數據庫高級(一)——數據完整性
A、建立表時指定自增自增列對象

create table product
 (
 productID int PRIMARY KEY AUTO_INCREMENT not NULL,
 pName VARCHAR(10),
 price DOUBLE
 )ENGINE=MyISAM default CHARSET=utf8;

B、爲現有的表指定自增列
alter table TStudent modify column studentID int PRIMARY KEY AUTO_INCREMENT;blog

C、刪除表中自增列
alter table TStudent modify column studentID int not NULL;
刪除自增列,仍然時主鍵,可是沒有自增加功能索引

四、複合主鍵

使用表的兩列或多列建立主鍵。
A、建立表時指定複合主鍵rem

create table student
 (
 studentID int,
 id INT,
 sname VARCHAR(10),
 score int,
 PRIMARY KEY(studentid,id)
 )ENGINE=MyISAM default CHARSET=utf8;

B、給表增長複合主鍵
alter table student add PRIMARY KEY(sudentID,id);
C、刪除複合主鍵
alter table student drop PRIMARY KEY;

五、惟一約束

UNIQUE KEY,惟一約束,指定某列和幾列組合的數據不能重複。
A、建立表時指定惟一性約束

create table score
 (sname VARCHAR(10) UNIQUE,
 score int not NULL
 );

B、給現有列增長惟一性約束
alter table score add CONSTRAINT uc_sname UNIQUE(sname);
若是表中現有記錄有重複值,不容許添加惟一性約束。能夠經過聚合函數,查找有重複值的記錄,刪除,再建立惟一性約束。
C、建立複合惟一性約束

create table student
 (
 studentID int,
 id INT,
 sname VARCHAR(10),
 score int,
 CONSTRAINT uc_id UNIQUE(studentID, id)
 )ENGINE=MyISAM default CHARSET=utf8;

D、刪除列的惟一性約束
alter table score drop index uc_sname;

3、域完整性

一、默認值

在表中插入一條新的記錄時,若是沒有爲該字段賦值,那麼數據庫系統會自動爲該字段賦一條默認值。

create table st
(
sid INT not null primary key auto_increment,
sname varchar(10),
subject varchar(20) default '軟件工程',
entertime TIMESTAMP default now()
);

給表中一列添加默認值約束:
alter table st modify column subject VARCHAR(20) default '計算機科學與技術';
刪除表中一列的默認值約束:
alter table st modify column subject VARCHAR(20) default NULL;

二、建立非空約束

非空約束用於確保當前列的值不爲空值,非空約束只能出如今表對象的列上。
Null類型特徵: 全部的類型的值均可以是null,包括int、float等數據類型 空字符串是不等於NULL,0也不等於NULL。
A、建立表時給列指定非空約束

create table score
 (sname VARCHAR(10) not NULL,
 score int not NULL
 );

B、給指定列指定非空約束
alter table score modify column score int not NULL;
C、刪除非空約束
alter table score modify column score int;

三、檢查check

check關鍵字,在插入新行或者更改已有行時才起做用,做用是阻止不知足條件的值進入該列,對null值無效,由於插入null就至關於沒有插入。一個列可有多個check。
age int check(age between 10 and 20);
目前MySQL不支持check約束,微軟MSSQL支持Check約束,但建立表時能夠指定Check約束,但不起做用。

4、參照完整性

一、參照完整性簡介

MySQL參照完整性通常是經過MySQL外鍵(foreign key)實現的。
外鍵(僅innoDB支持)所引用表的列必須是主鍵。
外鍵聲明包括三個部分:
A、哪一個列或列組合是外鍵
B、指定外鍵參照的表和列
C、參照動做[cascade(級聯操做),restrict(拒絕操做),set null(設爲空),no action,set default]。
若是外鍵約束指定了參照動做,主表記錄作修改,刪除,從表引用的列會作相應修改,或不修改,拒絕修改或設置爲默認值。
引用表的列名必須是主鍵,且在刪除引用表時必須刪除引用關係或者刪除當前表。

二、建立表時指定外鍵

建立兩張表,學生表student和成績表score,成績表的sid列的取值參照學生表(學生表student的sid列設置爲主鍵,且表的存儲引擎爲innodb,成績表score的存儲引擎也必須設置爲innodb)。

create table student
(
sid int not null primary key,
sname varchar(20)
) engine=innodb;
create table score
(
sid int not null,
mark INT,
constraint score_fk FOREIGN KEY (sid)
references student(sid) on delete cascade on update cascade
) engine=innodb;

在學生表插入一條記錄
insert into student values (1,'孫悟空')
在成績表插入一條記錄,學號是1,成功。
insert into score values (1,98)
在成績表插入一條記錄,學號是2,失敗。
insert into score values (2,88)
在學生表插入學號是2的一條記錄
insert into student values (2,'唐僧')
再在成績表插入一條學號是2的記錄,成功,證實外鍵參照成功。
insert into score values (2,88);

三、刪除參照約束

ALTER TABLEscoreDROP FOREIGN KEYscore_fk;

四、給現有表增長參照約束

ALTER TABLEscoreADD CONSTRAINTscore_fk2FOREIGN KEY (sid) REFERENCESstudent(sid);

五、驗證級聯動做刪除和更新

在score表建立的參照完整性,刪除動做和更新動做的參照動做選擇了cascade(級聯操做),當學生表的sid更新時,分數表score的相應的sid也會更新,當學生被刪除,分數表對應的sid的記錄也會自動刪除。
更新學生表學號是1的學生的學號爲10
update student set sid=10 where sid=1
查當作績表,能夠看到之前學號是1的已經變成了10
select * from score
刪除學生表學號是2的學生
delete from student where sid=2
能夠看到成績表,該學生的成績已經級聯刪除
select * from score

六、驗證級聯動做No Aaction

級聯動做設置爲NO ACTION,若是子表中有匹配的記錄,則不容許對父表對應候選鍵進行update/delete操做。
Restrict動做同no action,都是當即檢查外鍵約束。
將參照動做設置爲no action,若是成績表score有該學生sid,將不能更改學生表student表的學生sid列,也不能刪除該學生。除非你先刪除該學生的成績,再刪除該學生。
刪除score表的外鍵約束
ALTER TABLEscoreDROP FOREIGN KEYscore_fk;
增長score表的sid列外鍵約束

ALTER TABLE `score` ADD CONSTRAINT `score_fk` 
FOREIGN KEY (`sid`) REFERENCES `student` (`sid`)
 ON DELETE NO ACTION ON UPDATE NO ACTION;

更新學號是10的學生的學號,失敗
update student set sid=11 where sid=10
刪除學號是10的學生,失敗
delete from student where sid=10
須要先刪除該學生成績表中的記錄,再刪除該學生。

delete from student where sid=10
delete from score where sid=10;

七、驗證級聯動做Set NULL

在父表上update/delete記錄時,將子表上匹配記錄的列設爲null ,要注意子表的外鍵列不能爲not null。
刪除成績表的外鍵約束
ALTER TABLEscoreDROP FOREIGN KEYscore_fk;
增長成績表的sid列外鍵約束,參照動做爲set null
ALTER TABLEscoreADD CONSTRAINTscore_fkFOREIGN KEY (sid) REFERENCESstudent(sid) ON DELETE SET NULL ON UPDATE SET NULL;
修改爲績表的sid列默認值爲NULL

ALTER TABLE `score` MODIFY COLUMN `sid` INTEGER(11) DEFAULT NULL;
insert into student values (1,'孫悟空')
insert into student values (2,'豬八戒')
insert into score values (1,98)
insert into score values (2,88)

刪除學生表中學號1的學生
delete from student where sid=1
查當作績表,成績表中學號爲1的列爲NULL
select * from score

相關文章
相關標籤/搜索