1. 程式人生 > >python學習筆記 day44 外來鍵約束

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;

alter
table 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;

執行結果: