一、數據完整性(Data Integrity)是指數據的精確性(Accuracy)和可靠性(Reliability)。mysql
sql
域完整性(Domain Integrity):例如:年齡範圍0-120,性別範圍「男/女」數據庫
引用完整性(Referential Integrity):例如:員工所在部門,在部門表中要能找到這個部門工具
用戶自定義完整性(User-defined Integrity):例如:用戶名惟1、密碼不能爲空等spa
二、約束指針
code
Not NULL約束:非空約束orm
Check約束:檢查約束blog
Default約束:默認值約束排序
自增約束
三、約束(CONSTRAINTS)與索引(INDEX)
約束是用來對數據業務規則和數據完整性進行實施、維護。約束的做用範圍僅限在當前數據庫,是邏輯約束,不會由於設置約束而額外佔用空間。
能夠大大提升查詢速度。應該在鍵列、或其餘常常要查詢、排序、按範圍查找的列上創建索引。
其中主鍵刪除,對應的索引也會刪除
刪除惟一鍵的方式是經過刪除對應的索引來實現的
刪除外鍵,外鍵列上的索引還在,若是須要刪除,須要單獨刪除索引
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名稱'; 或 SHOW CREATE TABLE 表名;
SHOW INDEX FROM 表名稱;
主鍵分爲單列主鍵和複合主鍵
主鍵的特色:
(1)惟一而且非空(2)一個表只能有一個主鍵約束(3)主鍵約束名就叫作PRIMARY(4)建立主鍵會自動建立對應的索引,一樣刪除主鍵對應的索引也會刪除。
建表時指定主鍵約束
create table 【數據名.】表名( 字段名1 數據類型 primary key , .... ); 或 create table 【數據名.】表名( 字段名1 數據類型, ...., primary key(字段名1) ); 或 create table 【數據名.】表名( 字段名1 數據類型, 字段名2 數據類型, ...., primary key(複合主鍵字段列表) #若是是複合主鍵,那麼就須要在全部字段列表後面使用這種形式指定,不能在字段後面直接加primary key );
建表後指定主鍵約束
alter table 表名稱 add primary key (主鍵字段列表);
刪除主鍵約束
alter table 表名稱 drop primary key;
惟一鍵約束特色:
建表時指定惟一鍵約束
create table 【數據名.】表名( 字段名1 數據類型 primary key , 字段名2 數據類型 unique key, .... ); create table 【數據名.】表名( 字段名1 數據類型 primary key , 字段名2 數據類型, 字段名3 數據類型, ...., unique key(複合惟一字段列表) #若是是複合惟一鍵,那麼就須要在全部字段列表後面使用這種形式指定,不能在字段後面直接加unique key );
建表後增長惟一鍵約束
alter table 表名稱 add 【constraint 約束名】 unique 【key】 (字段名列表);
#若是沒有指定約束名,(字段名列表)中只有一個字段的,默認是該字段名,若是是多個字段的默認是字段名列表的第1個字段名。
刪除惟一鍵約束
ALTER TABLE 表名稱 DROP INDEX 惟一鍵約束名;
外鍵特色:
在建立外鍵約束時,若是不給外鍵約束名稱,默認名不是列名,而是自動產生一個外鍵名(例如 student_ibfk_1;),也能夠指定外鍵約束名。
當建立外鍵約束時,系統默認會在所在的列上創建對應的普通索引。可是索引名是列名,不是外鍵的約束名。
刪除外鍵時,關於外鍵列上的普通索引須要單獨刪除。
在從表上創建外鍵,並且主表要先存在。
一個表能夠創建多個外鍵約束
從表的外鍵列,在主表中引用的只能是鍵列(主鍵,惟一鍵,外鍵),推薦引用主表的主鍵。
從表的外鍵列與主表被參照的列名字能夠不相同,可是數據類型必須同樣
約束關係:約束是針對雙方的
添加了外鍵約束後,從表的添加和修改受約束
5個約束等級
Set null方式:在父表上update/delete記錄時,將子表上匹配記錄的列設爲null,可是要注意子表的外鍵列不能爲not null
No action方式:若是子表中有匹配的記錄,則不容許對父表對應候選鍵進行update/delete操做
Restrict方式:同no action, 都是當即檢查外鍵約束
Set default方式(在可視化工具SQLyog中可能顯示空白):父表有變動時,子表將外鍵列設置成一個默認的值,但Innodb不能識別
若是沒有指定等級,就至關於Restrict方式
建表時指定外鍵約束
create table 【數據名.】從表名( 字段名1 數據類型 primary key , 字段名2 數據類型 【unique key】, ...., 【constraint 外鍵約束名】 foreign key (從表字段) references 主表名(主表字段) 【on update 外鍵約束等級】【on delete 外鍵約束等級】 );
#外鍵只能在全部字段列表後面單獨指定
#若是要本身命名外鍵約束名,建議 主表名_從表名_關聯字段名_fk
建表後指定外鍵約束
alter table 從表名稱 add 【constraint 外鍵約束名】 foreign key (從表字段名) references 主表名(主表被參照字段名) 【on update xx】【on delete xx】;
刪除外鍵約束
ALTER TABLE 表名稱 DROP FOREIGN KEY 外鍵約束名;
#刪除外鍵約束不會刪除對應的索引
刪除索引
ALTER TABLE 表名稱 DROP INDEX 索引名;
規定某個字段不能爲空
建表時指定非空約束
create table 【數據名.】表名( 字段名1 數據類型 primary key , 字段名2 數據類型 【unique key】 【not null】, 字段名2 數據類型 【not null】, ...., );
建表後指定非空約束
ALTER TABLE 表名稱 MODIFY 字段名 數據類型 NOT NULL 【default 默認值】;
#若是該字段原來設置了默認值約束,要跟着一塊兒再寫一遍,不然默認值約束會丟失
刪除非空約束
ALTER TABLE 表名稱 MODIFY 字段名 數據類型 【default 默認值】;
#若是該字段原來設置了默認值約束,要跟着一塊兒再寫一遍,不然默認值約束會丟失
建表時指定默認約束
create table 【數據名.】表名( 字段名1 數據類型 primary key , 字段名2 數據類型 【unique key】 【not null】 【default 默認值】, 字段名3 數據類型 【not null】 【default 默認值】, ...., );
建表後指定默認值約束
ALTER TABLE 表名稱 MODIFY 字段名 數據類型 【default 默認值】 【NOT NULL】;
#若是該字段原來設置了非空約束,要跟着一塊兒再寫一遍,不然非空約束會丟失
刪除默認值約束
ALTER TABLE 表名稱 MODIFY 字段名 數據類型 【NOT NULL】;
#若是該字段原來設置了非空約束,要跟着一塊兒再寫一遍,不然非空約束會丟失
檢查約束,mysql暫不支持
特色:
自增加列必須是鍵列(主鍵列,惟一鍵列,外鍵列),而且要求非空。
自增列必須是整數類型
InnoDB表的自動增加列能夠手動插入,可是插入的值若是是空或者0,則實際插入的將是自動增加後的值。
建表時指定自增加
create table 【數據名.】表名( 字段名1 數據類型 primary key auto_increment, 字段名2 數據類型 【unique key】 【not null】 【default 默認值】, .... ); 或 create table 【數據名.】表名( 字段名1 數據類型 primary key , 字段名2 數據類型 【unique key not null】 auto_increment, .... );
建表後指定自增加
alter table 【數據名.】表名 modify 自增字段名 數據類型 auto_increment;
刪除自增約束
alter table 【數據名.】表名 modify 自增字段名 數據類型;
添加數據時,若是某列有自增約束,怎麼添加該字段的值
insert into 【數據庫名.]表名稱 values(值列表);#在值列表中,對應自增列能夠賦值爲null和0
insert into 【數據庫名.]表名稱(部分字段列表) values(值列表);#自增列在(部分字段列表)中不寫就能夠
添加數據時,若是某列有默認值約束,怎麼添加、修改該字段的值
insert into 【數據庫名.]表名稱 values(值列表);#在值列表中,對應默認值列,若是想用默認值,用default insert into 【數據庫名.]表名稱(部分字段列表) values(值列表);#對應默認值列,若是想用默認值,在(部分字段列表)中不寫就能夠
修改數據
update 【數據庫名.]表名稱 set 字段名1 = 值1, 字段名2 = 值2 。。。 【where 條件】; #對應默認值列,若是想用默認值,寫字段名 = default就能夠