1、數(shù)據(jù)完整性(Data Integrity)是指數(shù)據(jù)的精確性(Accuracy)和可靠性(Reliability)。
域完整性(Domain Integrity):例如:年齡范圍0-120,性別范圍“男/女”
引用完整性(Referential Integrity):例如:?jiǎn)T工所在部門,在部門表中要能找到這個(gè)部門
用戶自定義完整性(User-defined Integrity):例如:用戶名唯一、密碼不能為空等
2、約束
Not NULL約束:非空約束
Check約束:檢查約束
Default約束:默認(rèn)值約束
自增約束
3、約束(CONSTRAINTS)與索引(INDEX)
約束是用來(lái)對(duì)數(shù)據(jù)業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性進(jìn)行實(shí)施、維護(hù)。約束的作用范圍僅限在當(dāng)前數(shù)據(jù)庫(kù),是邏輯約束,不會(huì)因?yàn)樵O(shè)置約束而額外占用空間。
可以大大提高查詢速度。應(yīng)該在鍵列、或其他經(jīng)常要查詢、排序、按范圍查找的列上建立索引。
其中主鍵刪除,對(duì)應(yīng)的索引也會(huì)刪除
刪除唯一鍵的方式是通過(guò)刪除對(duì)應(yīng)的索引來(lái)實(shí)現(xiàn)的
刪除外鍵,外鍵列上的索引還在,如果需要?jiǎng)h除,需要單獨(dú)刪除索引
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名稱'; 或 SHOW CREATE TABLE 表名;
SHOW INDEX FROM 表名稱;
主鍵分為單列主鍵和復(fù)合主鍵
主鍵的特點(diǎn):
(1)唯一并且非空(2)一個(gè)表只能有一個(gè)主鍵約束(3)主鍵約束名就叫做PRIMARY(4)創(chuàng)建主鍵會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)的索引,同樣刪除主鍵對(duì)應(yīng)的索引也會(huì)刪除。
建表時(shí)指定主鍵約束
create table 【數(shù)據(jù)名.】表名( 字段名1 數(shù)據(jù)類型 primary key , .... ); 或 create table 【數(shù)據(jù)名.】表名( 字段名1 數(shù)據(jù)類型, ...., primary key(字段名1) ); 或 create table 【數(shù)據(jù)名.】表名( 字段名1 數(shù)據(jù)類型, 字段名2 數(shù)據(jù)類型, ...., primary key(復(fù)合主鍵字段列表) #如果是復(fù)合主鍵,那么就需要在所有字段列表后面使用這種形式指定,不能在字段后面直接加primary key );
建表后指定主鍵約束
alter table 表名稱 add primary key (主鍵字段列表);
刪除主鍵約束
alter table 表名稱 drop primary key;
唯一鍵約束特點(diǎn):
建表時(shí)指定唯一鍵約束
create table 【數(shù)據(jù)名.】表名( 字段名1 數(shù)據(jù)類型 primary key , 字段名2 數(shù)據(jù)類型 unique key, .... ); create table 【數(shù)據(jù)名.】表名( 字段名1 數(shù)據(jù)類型 primary key , 字段名2 數(shù)據(jù)類型, 字段名3 數(shù)據(jù)類型, ...., unique key(復(fù)合唯一字段列表) #如果是復(fù)合唯一鍵,那么就需要在所有字段列表后面使用這種形式指定,不能在字段后面直接加unique key );
建表后增加唯一鍵約束
alter table 表名稱 add 【constraint 約束名】 unique 【key】 (字段名列表);
#如果沒(méi)有指定約束名,(字段名列表)中只有一個(gè)字段的,默認(rèn)是該字段名,如果是多個(gè)字段的默認(rèn)是字段名列表的第1個(gè)字段名。
刪除唯一鍵約束
ALTER TABLE 表名稱 DROP INDEX 唯一鍵約束名;
外鍵特點(diǎn):
在創(chuàng)建外鍵約束時(shí),如果不給外鍵約束名稱,默認(rèn)名不是列名,而是自動(dòng)產(chǎn)生一個(gè)外鍵名(例如 student_ibfk_1;),也可以指定外鍵約束名。
當(dāng)創(chuàng)建外鍵約束時(shí),系統(tǒng)默認(rèn)會(huì)在所在的列上建立對(duì)應(yīng)的普通索引。但是索引名是列名,不是外鍵的約束名。
刪除外鍵時(shí),關(guān)于外鍵列上的普通索引需要單獨(dú)刪除。
在從表上建立外鍵,而且主表要先存在。
一個(gè)表可以建立多個(gè)外鍵約束
從表的外鍵列,在主表中引用的只能是鍵列(主鍵,唯一鍵,外鍵),推薦引用主表的主鍵。
從表的外鍵列與主表被參照的列名字可以不相同,但是數(shù)據(jù)類型必須一樣
約束關(guān)系:約束是針對(duì)雙方的
添加了外鍵約束后,從表的添加和修改受約束
5個(gè)約束等級(jí)
Set null方式:在父表上update/delete記錄時(shí),將子表上匹配記錄的列設(shè)為null,但是要注意子表的外鍵列不能為not null
No action方式:如果子表中有匹配的記錄,則不允許對(duì)父表對(duì)應(yīng)候選鍵進(jìn)行update/delete操作
Restrict方式:同no action, 都是立即檢查外鍵約束
Set default方式(在可視化工具SQLyog中可能顯示空白):父表有變更時(shí),子表將外鍵列設(shè)置成一個(gè)默認(rèn)的值,但I(xiàn)nnodb不能識(shí)別
如果沒(méi)有指定等級(jí),就相當(dāng)于Restrict方式
建表時(shí)指定外鍵約束
create table 【數(shù)據(jù)名.】從表名( 字段名1 數(shù)據(jù)類型 primary key , 字段名2 數(shù)據(jù)類型 【unique key】, ...., 【constraint 外鍵約束名】 foreign key (從表字段) references 主表名(主表字段) 【on update 外鍵約束等級(jí)】【on delete 外鍵約束等級(jí)】 );
#外鍵只能在所有字段列表后面單獨(dú)指定
#如果要自己命名外鍵約束名,建議 主表名_從表名_關(guān)聯(lián)字段名_fk
建表后指定外鍵約束
alter table 從表名稱 add 【constraint 外鍵約束名】 foreign key (從表字段名) references 主表名(主表被參照字段名) 【on update xx】【on delete xx】;
刪除外鍵約束
ALTER TABLE 表名稱 DROP FOREIGN KEY 外鍵約束名;
#刪除外鍵約束不會(huì)刪除對(duì)應(yīng)的索引
刪除索引
ALTER TABLE 表名稱 DROP INDEX 索引名;
規(guī)定某個(gè)字段不能為空
建表時(shí)指定非空約束
create table 【數(shù)據(jù)名.】表名( 字段名1 數(shù)據(jù)類型 primary key , 字段名2 數(shù)據(jù)類型 【unique key】 【not null】, 字段名2 數(shù)據(jù)類型 【not null】, ...., );
建表后指定非空約束
ALTER TABLE 表名稱 MODIFY 字段名 數(shù)據(jù)類型 NOT NULL 【default 默認(rèn)值】;
#如果該字段原來(lái)設(shè)置了默認(rèn)值約束,要跟著一起再寫一遍,否則默認(rèn)值約束會(huì)丟失
刪除非空約束
ALTER TABLE 表名稱 MODIFY 字段名 數(shù)據(jù)類型 【default 默認(rèn)值】;
#如果該字段原來(lái)設(shè)置了默認(rèn)值約束,要跟著一起再寫一遍,否則默認(rèn)值約束會(huì)丟失
建表時(shí)指定默認(rèn)約束
create table 【數(shù)據(jù)名.】表名( 字段名1 數(shù)據(jù)類型 primary key , 字段名2 數(shù)據(jù)類型 【unique key】 【not null】 【default 默認(rèn)值】, 字段名3 數(shù)據(jù)類型 【not null】 【default 默認(rèn)值】, ...., );
建表后指定默認(rèn)值約束
ALTER TABLE 表名稱 MODIFY 字段名 數(shù)據(jù)類型 【default 默認(rèn)值】 【NOT NULL】;
#如果該字段原來(lái)設(shè)置了非空約束,要跟著一起再寫一遍,否則非空約束會(huì)丟失
刪除默認(rèn)值約束
ALTER TABLE 表名稱 MODIFY 字段名 數(shù)據(jù)類型 【NOT NULL】;
#如果該字段原來(lái)設(shè)置了非空約束,要跟著一起再寫一遍,否則非空約束會(huì)丟失
檢查約束,mysql暫不支持
特點(diǎn):
自增長(zhǎng)列必須是鍵列(主鍵列,唯一鍵列,外鍵列),并且要求非空。
自增列必須是整數(shù)類型
InnoDB表的自動(dòng)增長(zhǎng)列可以手動(dòng)插入,但是插入的值如果是空或者0,則實(shí)際插入的將是自動(dòng)增長(zhǎng)后的值。
建表時(shí)指定自增長(zhǎng)
create table 【數(shù)據(jù)名.】表名( 字段名1 數(shù)據(jù)類型 primary key auto_increment, 字段名2 數(shù)據(jù)類型 【unique key】 【not null】 【default 默認(rèn)值】, .... ); 或 create table 【數(shù)據(jù)名.】表名( 字段名1 數(shù)據(jù)類型 primary key , 字段名2 數(shù)據(jù)類型 【unique key not null】 auto_increment, .... );
建表后指定自增長(zhǎng)
alter table 【數(shù)據(jù)名.】表名 modify 自增字段名 數(shù)據(jù)類型 auto_increment;
刪除自增約束
alter table 【數(shù)據(jù)名.】表名 modify 自增字段名 數(shù)據(jù)類型;
添加數(shù)據(jù)時(shí),如果某列有自增約束,怎么添加該字段的值
insert into 【數(shù)據(jù)庫(kù)名.]表名稱 values(值列表);#在值列表中,對(duì)應(yīng)自增列可以賦值為null和0
insert into 【數(shù)據(jù)庫(kù)名.]表名稱(部分字段列表) values(值列表);#自增列在(部分字段列表)中不寫就可以
添加數(shù)據(jù)時(shí),如果某列有默認(rèn)值約束,怎么添加、修改該字段的值
insert into 【數(shù)據(jù)庫(kù)名.]表名稱 values(值列表);#在值列表中,對(duì)應(yīng)默認(rèn)值列,如果想用默認(rèn)值,用default insert into 【數(shù)據(jù)庫(kù)名.]表名稱(部分字段列表) values(值列表);#對(duì)應(yīng)默認(rèn)值列,如果想用默認(rèn)值,在(部分字段列表)中不寫就可以
修改數(shù)據(jù)
update 【數(shù)據(jù)庫(kù)名.]表名稱 set 字段名1 = 值1, 字段名2 = 值2 。。。 【where 條件】; #對(duì)應(yīng)默認(rèn)值列,如果想用默認(rèn)值,寫字段名 = default就可以
聯(lián)系客服