python學習筆記 day44 表與表之間的關係
1. 表與表之間的關係:一對多;一對一;多對多;
表與表之間怎麼建立一對一的關係呢,可以使用外來鍵約束+唯一約束;
有兩種方式:
1.利用主鍵,一張表的主鍵只能有一個,所以這張表就可以滿足唯一,另一張表跟前面那張表的主鍵關聯的欄位設定為外來鍵,並且該外來鍵欄位設定為唯一欄位(也就是當兩張表關聯的兩個欄位之一是一張表的主鍵,則另一張表相應欄位設定為外來鍵+唯一約束即可);---使用者-部落格表(假設一個使用者只能有一個部落格)
2. 外來鍵與普通欄位:普通欄位加唯一約束,外來鍵欄位設定為外來鍵 加唯一約束,也就是如果是兩張表的關聯欄位都不是主鍵,則兩張表的一張表關聯欄位設定為唯一約束,另一張表的關聯欄位設定為外來鍵約束(外來鍵必須是前一張表的主鍵)+唯一約束
2. 一對多: (一的表正常建立,多的表關聯欄位新增外來鍵)
2.1 場景: 人-汽車表(一個人可以擁有很多部汽車) person表就是一,汽車表就是多, 另外建立一的那張表就正常建立,設定主鍵就好了;而多那張表需要設定外來鍵約束(跟前面那張表的主鍵約束);
首先建立人員資訊表:
create table person( id varchar(10) not null PRIMARY key, # 人員資訊表的主鍵 其實是跟car表關聯的欄位 name varchar(20) not null, age intnot null, sex int not null) alter table person modify sex char(2) not null; insert into person values("P0001","西西",22,"女"); insert into person values("P0002","東東",23,"男"); insert into person values("P0003","楠楠",24,"女"); select * from person;
執行結果:
設計汽車表(多:外來鍵約束)
create tablecar( cid varchar(10) not null primary key, # car表中的主鍵 name varchar(20) not null default "大眾" , p_id varchar(10) not null, # car表中跟person表中關聯的欄位,需要設定為外來鍵約束 constraint fk_pid foreign key(p_id) references person(id)) # 設定為外來鍵約束(關聯另一張表person的主鍵id) insert into car values("c0001","大眾","P0001"); # 這兩個車都是屬於同一個人P0001 insert into car values("c0002","賓士","P0001"); # 這兩個車都是屬於同一個人P0001 insert into car values("c0003","奧迪","P0002"); # c0002車屬於P0002這個人 insert into car values("c0004","奧迪","P0003"); select * from car;
執行結果:
這樣person表和car表就建立了一對多的關係,person表的id 是該表的主鍵,也是跟car這張表的關聯欄位,car這張表也有一個主角,就是car的id,但是car這張表的p-id就是所屬人id 代表這個車屬於哪個車主,需要設定為外來鍵約束(這樣car這種表的p-id 多條資料可以具有相同的p-id 表示多輛車具有相同的車主,一個人擁有多部車)
2.2 場景: 班級-學生表,一個班級可以對應很多學生,就是一對多,所以class 表正常建立,student表需要對關聯欄位建立外來鍵約束;
建立班級表(一,需要設定主鍵,並且這個主鍵是兩張表的關聯欄位)
create table class( id varchar(10) not null primary key, # 班級id設定為主鍵,其實也是兩張表的關聯欄位 c_name varchar(30) not null) insert into class values("C0001","python課程班級"); insert into class values("C0002","java課程班級"); select * from class;
執行結果:
建立學生表(多,需要對關聯欄位-就是學生表中需要記錄該名學生屬於哪個班級,新增外來鍵約束)
create table student( id varchar(10) not null primary key, name varchar(30) not null, age int not null default 22, sex char(2) not null default "女", c_id varchar(20) not null, # student表中的外來鍵,關聯的是class表中的班級id(主鍵)所以多student表中新增外來鍵約束即可; constraint fk_student_cid foreign key(c_id) references class(id) # 對student表中的c_id設定外來鍵約束,關聯的是class表的班級id # 需要注意 student表的外來鍵c-id 必須跟class表的主鍵id資料型別一樣~~ ) insert into student values("S0001","西西",22,"女","C0001"); # S0001 S0002屬於同一個班級,student表的c-id欄位可以重複(也就是多) insert into student values("S0002","靜靜",23,"女","C0001"); insert into student values("S0003","東東",24,"男","C0002"); insert into student values("S0004","二狗子",25,"男","C0002"); select * from student;
執行結果:
這樣兩張表就建立了一對多的關係,class的id 是主鍵唯一,student表的關聯欄位是c-id 需要設定為外來鍵 這樣student表的c-id就可以多條資料具有相同的值,也就是很多個學生可以同屬於一個班級(一個班級具有很多學生--一對多)
3. 一對一
表與表之間一對一的約束關係有兩種建立方法:
1. 普通欄位(code)加唯一約束,關聯欄位(c_id)設定為外來鍵約束加唯一約束(比如人 身份證兩張表 需要表示的是一個人有一個身份證號碼,但是在card表中id是主鍵,身份證號是普通欄位,所以card表需要設定普通欄位code的唯一約束,另外person表需要id就是設定為主鍵,但是person表需要記錄身份證的資訊,也就是需要給一個關聯欄位,關聯欄位又只能跟別的表的主鍵關聯作為外來鍵,所以person表關聯欄位需要設定外來鍵+唯一約束)
2. 兩張表的一其中一個是主鍵,另外一張表設定為外來鍵約束和唯一約束(區別就是一是主鍵的那張表 不需要設定普通欄位為唯一約束,因為一本來就是主鍵,主鍵本來就唯一)
3.1 場景:每一個人都只擁有一個身份證;
需要建立兩張表 person人員資訊表,具有id name age sex p_code (就是人員資訊表都得記錄每一個人所具有的身份證號的資訊----這裡是根據身份證card表的id來關聯的,card表的id就是主鍵,然後code有設定為unique 所以一個id就對應一個code編號,所以在person表中查詢id也能唯一的找到code) ,另一張表就是身份證資訊的表 包含id code (身份證編號) 這兩張表就是一對一的關係,也就是person表的c-id需要設定為外來鍵+唯一約束,card表的code普通欄位需要新增唯一約束;
建立身份證資訊表card表(id 是主鍵(另一張表person的c-id需要關聯的欄位),code:普通欄位,需新增唯一約束):
create table card( id varchar(10) not null primary key, # card 表的主鍵,person表c_id的關聯欄位(主鍵和外來鍵資料型別必須一樣,其實就是一個東西,只是在兩張表中都出現) code varchar(20) not null unique # 需要為普通欄位新增唯一約束,因為一對一指的就是card的code普通欄位 還有person表的c-id 外來鍵+唯一約束 ) insert into card values("C0001","129304903940"); insert into card values("C0002","232392039094"); insert into card values("C0003","403903403283"); # 三條不同的身份證資訊 select * from card;
執行結果:
建立身份證資訊表:
create table person_info( id varchar(10) not null primary key, # person表的主鍵 name varchar(20) not null, age int not null default 22, sex char(2) not null default "女", c_id varchar(10) not null unique, # 跟card表的主鍵id關聯的欄位,需要新增外來鍵和唯一約束的 constraint fk_person_cid foreign key(c_id) references card(id)) insert into person_info values("P0001","西西",22,"女","C0003"); # P0001 對應的身份證資訊是C0003那條資料; insert into person_info values("P0002","楠楠",24,"男","C0001"); insert into person_info values("P0003","寶寶",23,"女","C0002"); select * from person_info;
執行結果:
這樣兩張表person表和card表就通過person表的c_id外來鍵約束+唯一約束 跟 card表的id 主鍵關聯 與card表的code普通欄位(新增唯一約束)建立了一對一的關係;
3.2 場景:假設一個使用者只能有一個部落格:
一張表設定主鍵(表的一) 另一張表外來鍵約束+唯一約束(另一張表的一)
(其實我覺得這兩張表的建立可以跟身份證資訊表建立思路是一樣的,就是首先建立 部落格表(普通欄位新增唯一約束) 然後建立人員資訊表,主鍵id 關聯欄位就是人員資訊表的blog-id 設定為部落格表主鍵id的外來鍵,並且新增唯一約束 我覺得這樣也行其實,,,,)
先建立人員資訊表:
create table user( id varchar(10) not null primary key, name varchar(20) not null) insert into user values("U0001","西西"); insert into user values("U0002","東東"); select * from USER;
執行結果:
建立blog表:
create table blog( id varchar(10) not null primary key, name varchar(20) not null, user_id varchar(10) not null unique, -- 兩張表的關聯欄位,設定為外來鍵(關聯的是user表的主鍵id,通過外來鍵user-id就可以唯一找到這個人 constraint blog_userid foreign key(user_id) references user(id)) -- 需要為外來鍵新增唯一約束(這樣兩張表就建立一對一的關係) insert into blog values("B0001","璇璇是小仙女呀","U0002"); # 這個部落格是U0002使用者的 insert into blog values("B0002","小仙女哈哈哈哈","U0001"); select * from blog;
執行結果:
4. 多對多:(如果是兩張表之間多對多,一般需要建立三張表,兩張獨立的實體表,另外一張可以建立兩張表關聯的關係表)
4.1 場景: 學生選課,一個學生可以選很多門課,每門課可以提供很多學生選擇;
一般我們需要建立三張表,兩張實體表,就是獨立的學生表和課程表,另外一個就是關係表,相當於兩張多對多是體表的橋樑;
首先建立實體表學生表:
create table student_info( id varchar(10) not null primary key, name varchar(20) not null, age int not null, sex char(2) not null ) insert into student_info values("S0001","璇璇",22,"女"); insert into student_info values("S0002","西西",23,"女"); insert into student_info values("S0003","東東",24,"男"); insert into student_info values("S0004","楠楠",25,"男"); select * from student_info;
執行結果:
建立實體表課程表:
create table course( id varchar(10) not null primary key, name varchar(10) not null) insert into course values("C0001","python課程"); insert into course values("C0002","java課程"); insert into course values("C0003","c++課程"); select * from course;
執行結果:
建立關係表(反映兩張實體表多對多關係的關係表):
create table relation_info( s_id varchar(10) not null, c_id varchar(10) not null, primary key(s_id,c_id), # 將s_id 與 c_id設定為聯合主鍵 分別指的是student_info表的學生id 以及course表的課程id constraint fk_relation_info_sid foreign key(s_id) references student_info(id), # 為關係表中的兩個欄位(其實就是另外兩張表的主鍵,新增外來鍵約束) constraint fk_relation_info_cid foreign key(c_id) references course(id)) insert into relation_info values("S0001","C0002"); # s00001選了C0002這門課 insert into relation_info values("S0001","C0003"); insert into relation_info values("S0001","C0001"); insert into relation_info values("S0003","C0001"); insert into relation_info values("S0003","C0002"); insert into relation_info values("S0003","C0003"); insert into relation_info values("S0002","C0002"); insert into relation_info values("S0002","C0003"); select * from relation_info;
執行結果: