Mysql基礎02-約束
約束與索引
概念
1、資料完整性(Data Integrity)是指資料的精確性(Accuracy)和可靠性(Reliability)。
-
實體完整性(Entity Integrity):例如,同一個表中,不能存在兩條完全相同無法區分的記錄
-
域完整性(Domain Integrity):例如:年齡範圍0-120,性別範圍“男/女”
-
引用完整性(Referential Integrity):例如:員工所在部門,在部門表中要能找到這個部門
-
使用者自定義完整性(User-defined Integrity):例如:使用者名稱唯一、密碼不能為空等
2、約束
-
鍵約束:主鍵約束、外來鍵約束、唯一鍵約束
-
Not NULL約束:非空約束
-
Check約束:檢查約束
-
Default約束:預設值約束
-
自增約束
3、約束(CONSTRAINTS)與索引(INDEX)
約束是用來對資料業務規則和資料完整性進行實施、維護。約束的作用範圍僅限在當前資料庫,是邏輯約束,不會因為設定約束而額外佔用空間。
索引是一個單獨、物理的儲存在資料頁上的資料庫結構,它是表中一列或若干列值的集合和相應的指向表中資料值的物理標識資料頁的邏輯指標清單(類似於新華字典的目錄索引頁)。可以大大提高查詢速度。應該在鍵列、或其他經常要查詢、排序、按範圍查詢的列上建立索引。
Mysql會在主鍵、唯一鍵、外來鍵列上自動建立索引,其他列需要建立索引的話,需要手動建立。
其中主鍵刪除,對應的索引也會刪除
刪除唯一鍵的方式是通過刪除對應的索引來實現的
刪除外來鍵,外來鍵列上的索引還在,如果需要刪除,需要單獨刪除索引
檢視某個表的約束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名稱'; 或 SHOW CREATE TABLE 表名;
檢視某個表的索引
SHOW INDEX FROM 表名稱;
主鍵約束:primary key
主鍵分為單列主鍵和複合主鍵
主鍵的特點:
(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;
唯一鍵約束:unique key
唯一鍵約束特點:
(1)同一個表可以有多個唯一約束。(2)唯一約束可以是某一個列的值唯一,也可以多個列組合值的唯一。(3)MySQL會給唯一約束的列上預設建立一個唯一索引。(4)刪除唯一鍵只能通過刪除對應索引的方式刪除,刪除時需要指定唯一鍵索引名
建表時指定唯一鍵約束
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 唯一鍵約束名;
外來鍵約束:foreign key
外來鍵特點:
-
外來鍵約束是保證一個或兩個表之間的參照完整性,外來鍵是構建於一個表的兩個欄位或是兩個表的兩個欄位之間的參照關係。
-
在建立外來鍵約束時,如果不給外來鍵約束名稱,預設名不是列名,而是自動產生一個外來鍵名(例如 student_ibfk_1;),也可以指定外來鍵約束名。
-
當建立外來鍵約束時,系統預設會在所在的列上建立對應的普通索引。但是索引名是列名,不是外來鍵的約束名。
-
刪除外來鍵時,關於外來鍵列上的普通索引需要單獨刪除。
要求
-
在從表上建立外來鍵,而且主表要先存在。
-
一個表可以建立多個外來鍵約束
-
從表的外來鍵列,在主表中引用的只能是鍵列(主鍵,唯一鍵,外來鍵),推薦引用主表的主鍵。
-
從表的外來鍵列與主表被參照的列名字可以不相同,但是資料型別必須一樣
約束關係:約束是針對雙方的
添加了外來鍵約束後,主表的修改和刪除受約束
添加了外來鍵約束後,從表的新增和修改受約束
5個約束等級
-
Cascade方式:在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄
-
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 索引名;
非空約束:not null
規定某個欄位不能為空
建表時指定非空約束
create table 【資料名.】表名( 欄位名1 資料型別 primary key , 欄位名2 資料型別 【unique key】 【not null】, 欄位名2 資料型別 【not null】, ...., );
建表後指定非空約束
ALTER TABLE 表名稱 MODIFY 欄位名 資料型別 NOT NULL 【default 預設值】;
#如果該欄位原來設定了預設值約束,要跟著一起再寫一遍,否則預設值約束會丟失
刪除非空約束
ALTER TABLE 表名稱 MODIFY 欄位名 資料型別 【default 預設值】;
#如果該欄位原來設定了預設值約束,要跟著一起再寫一遍,否則預設值約束會丟失
預設值約束: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暫不支援
自增約束:auto_increment
特點:
-
一個表最多隻能有一個自增長列
-
自增長列必須是鍵列(主鍵列,唯一鍵列,外來鍵列),並且要求非空。
-
自增列必須是整數型別
-
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就可以