1. 程式人生 > >python學習筆記 day44 表與表之間的關係

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 int
not 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 table
car( 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;

執行結果: