約束與索引 概念 1、數據完整性(Data Integrity)是指數據的精確性(Accuracy)和可靠性(Reliability)。 實體完整性(Entity Integrity):例如,同一個表中,不能存在兩條完全相同無法區分的記錄 域完整性(Domain Integrity):例如:年齡範圍 ...
1、數據完整性(Data Integrity)是指數據的精確性(Accuracy)和可靠性(Reliability)。
-
-
域完整性(Domain Integrity):例如:年齡範圍0-120,性別範圍“男/女”
-
引用完整性(Referential Integrity):例如:員工所在部門,在部門表中要能找到這個部門
-
用戶自定義完整性(User-defined Integrity):例如:用戶名唯一、密碼不能為空等
2、約束
-
-
Not NULL約束:非空約束
-
Check約束:檢查約束
-
Default約束:預設值約束
-
自增約束
3、約束(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就可以