python學習筆記 day44 外來鍵約束
1. 外來鍵約束
約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表資料的完整性和唯一性;
一張表的主鍵在其它表中就成為外來鍵;(比如之前dept表的id 是主鍵,另一張person表的dept_id與之對應就是外來鍵)
場景:
person表人員資訊其實是不能沒有dept_id 部門id的,所以在建立表時需要對錶的dept_id做一個約束,簡單來說就是對兩個表的關係進行一些約束,即foreign key
foreign key: 表與表之間的某種約束關係,由於這種關係的存在能夠讓表與表之間的資料更加完整,關聯性更強;
1.1 在建立表時就對錶的某些欄位(與另一張表的主鍵相關聯的欄位)進行外來鍵約束設定;
table person2( id int not null auto_increment primary key, name varvhar(50) not null, age int not NULL, sex char(2) not null, salary int not null, dept_id int not NULL constraint fk_did foreign key(dept_id) references dept(did)) # 為person表的dept_id設定外來鍵
1.2 已經建立表後追加外來鍵約束:
(外來鍵關聯的那張表,,dept表的did必須設定為主鍵,person表的dept_id才可以設定為外來鍵)
alter table dept add primary key(did) # dept表的did必須得設為主鍵,才能為person表的dept_id設為外來鍵 alter table person add constraint fk_did foreign key(dept_id) references dept(did);
一般外來鍵是不可以為空的!!!
刪除主鍵:alter table person drop foreign key fk_did;
altertable person drop foreign key fk_did; # 刪除外來鍵 desc person; alter table person modify dept_id int not null; # 外來鍵不能為空 alter table person add constraint fk_did foreign key(dept_id) references dept(did);
執行結果:
定義外來鍵的條件:
1. 外來鍵欄位對應的欄位資料型別需要保持一致,且被關聯的欄位(references 指定的另一張表的欄位did 必須唯一dept(did)) ;
2. 所有tables的儲存引擎必須為INNODB型別的;
3. 外來鍵的約束有四種類型,1 RESTRICT (主表 dept表不能隨便刪除,因為從表person中設定為外來鍵的欄位dept_id需要用到dept中主鍵did欄位的值)2.NO ACTION 3. CASCADE(主表刪了,從表對應的資料也就沒了,這個慎用!!!) 4. SET NULL;
4. 建議: 如果需要外來鍵約束,最好建立表同時建立外來鍵約束;
如果需要設定級聯關係,刪除時最好設定為set null
注意: 插入資料之前,先插入主表(dept)中資料,再插入從表(person)中的資料;
刪除資料時,先刪除從表(person)中的資料,再刪除主表中的資料;
2. 其他約束型別
2.1 非空約束 NOT NULL 非空,用來約束表中的欄位列;
2.2 主鍵約束:用來約束表中一行,作為一行的識別符號,在一張表中通過主鍵就可以精準定位到某一行;(主鍵這一行的資料不能重複且不能為空)
create table info( id int not null, name varchar(50) not null, primary key(id,name)) # 設定為聯合主鍵
2.3 唯一約束: 關鍵字UNIQUE 規定表中指定的一列值必須不能重複,即這一列的值都唯一(UNIQUE可以設定多個,也可以某兩個欄位一起設定為UNIQUE 也就是兩個欄位不都一樣就可以,跟主鍵的區別是,主鍵無論是單一欄位設定為主鍵還是聯合主鍵都必須有一個,而唯一約束是可以設定多個)
create table info2( id int not null, name varchar(30) not null, age int not null, salary int not NULL, Unique id_name(id,name) )
執行結果(往info2中插入資料時,id,name的值在兩條資料中不能同時一樣)
4. 預設值約束 default
create table info3( id int not null, name varchar(20) not null default "張三") insert into info3(id,name) values(1,default),(2,default) insert into info3(id) values(3),(4) select * from info3;
執行結果: