1. 程式人生 > >03 數據庫入門學習-完整性約束、關聯關系

03 數據庫入門學習-完整性約束、關聯關系

相同 學生 開始 主鍵約束 primary not ddr 學校 use

一、完整性約束

1.什麽是約束

  為了保證數據的合法性與完整性,對字段進行了除了數據類型以外添加額外的約束。

2.not null

  2.1意義

    not null是非空約束,數據不能為空

  2.2語法

create table student (id int,name char(10) not null);#名字不能為空

3.default

  3.1意義

    default 默認值約束,可以指定字段的默認值

  3.2語法

create table user (id int,name char(10) not null,sex char(5) default "woman");

#當在一個大多數的情況都為一個值的時候,就可以用默認約束


4.unique

  4.1意義

    unique 唯一性約束,該字段的值不能重復。比如,身份證,手機號,學號

    unique其實是一種索引,索引是一種數據結構,用於提高查詢效率。

    unique可以為空,一張表中可以有多個唯一約束

  4.2語法

    單列唯一約束

create table t5(idcard char(18) unique);

    多列聯合唯一約束

create table t6(idcard char(18),phonenumber char(11),unique(idcard,phonenumber));
#意思: 身份證相同 並且 手機號相同 那就叫相同


5.primary key

  5.1意義

    primary key稱之為主鍵約束,用於唯一標識表中一條記錄。

    如何能做到唯一標識?

      該字段,只要是唯一的,並且不為空即可。也就是說,從約束的角度來看主鍵約束和非空加唯一約束沒有區別

    那它們之間的區別是什麽?

      唯一約束,是一種索引,必然存在硬盤上的某個文件中,是物理層面(實實在在存在的數據)
      primary key,是一種邏輯意義上的數據(實際上不存在)
      換句話說,主鍵就是由唯一約束和非空約束 組成的約束

    有主鍵和沒有主鍵的區別?
      1.無法區分兩個相同記錄,比如班級裏有兩個人名字相同

      2.有主鍵則意味有這索引,效率更高
      3.可以建立關聯關系

  5.2語法

create table stu (stuid int primary key,name char(3));
#create table stu(stuid int unique not null,name char(3));

  多列聯合主鍵:

create table t8(idcard char(18),phonenumber char(11),primary key(idcard,phonenumber));
#註意復合主鍵必須同時建立或者同時刪除


6.auto_increment

  6.1意義

    auto_increment ,自動增長,通常搭配主鍵字段使用,可以自動為你的數據分配逐漸
    如何分配的?
      添加一條就自動加1 計數從1開始

  6.2語法

create table t9(id int primary key auto_increment,name char(3));

  如果主鍵是自動增長的,當你執行insert操作時要註意,插入的時候可以跳過這個字段或者插入的時候為null

  修改自動增長的起始位置

alter table t9 auto_increment = 7;

7.foreign key

  7.1意義

    foreign key 專門用於為表和表之間建立物理關聯

    現在有兩張表,員工表和部門表

      1. 從員工出發 員工對於部門來說 時 多個員工對應一個部門
      2. 從部門出發 一個部門對應多個員工

    雖然有了關系,但是兩個表之間還是沒有任何物理聯系,插一個不存在的部門也沒問題。

    所以就需要外鍵來是的員工表和部門表產生關聯。

    添加外鍵約束時: 產生的限制
      被關聯的表需要先被創建
      部門數據(主表)應該先插入 員工數據(從表)後插入
      在刪除部門數據前(主表)前 要保證該部門的員工數據都刪除了
      在更新部門編號前 要先保證沒有員工關聯到這個部門

    簡單的說 外鍵指的是 另一張的主鍵

      外鍵加上以後 主表中的數據 刪除 和更新時 都受到限制

  7.2語法

    先創建部門表(主表)

create table dept(id int primary key auto_increment,name char(10),manager char(10));

    在創建員工表(從表)

create table emp(id int primary key auto_increment,name char(10),dept_id int,foreign key(dept_id) references dept(id));

8.級聯操作

8.1意義

   常用於外鍵,指的是就是主表與從表同步更新和刪除

8.2語法

技術分享圖片
create table class(id int primary key auto_increment,namechar(10));
create table student(
id int primary key auto_increment,
name char(10),
c_id int,
foreign key(c_id) references class(id)
on update cascade#同步更新
on delete cascade#同步刪除
);

#對主表的id進行更新
#以及刪除某條主表記錄 來驗證效果
技術分享圖片

二、關聯關系

1.一對多或多對一

技術分享圖片
表:學校表和課程表
關系:一個學校有多個課程
1 創建學校表:有學校id,學校名稱,地址
create table school(id int primary key auto_increment,
name char(10),
address char(20)
);

2 創建課程表:有課程id,課程名稱,課程價格,課程周期,所屬學校
create table course(id int primary key auto_increment,
name char(10),
price int,
period char(5),
school_id int,
foreign key(school_id)
references school(id)
on update cascade
on delete cascade
);

3.創建學校
insert into school(name,address) values
(‘oldboyBeijing‘,‘北京昌平‘),
(‘oldboyShanghai‘,‘上海浦東‘)
;



4.創建課程
insert into course(name,price,period,school_id) values
(‘Python全棧開發一期‘,20000,‘5個月‘,2),
(‘Linux運維一期‘,200,‘2個月‘,2),
(‘Python全棧開發20期‘,20000,‘5個月‘,1)
;
技術分享圖片

2.一對一

技術分享圖片
表:學生表和客戶表
關系:一個學生對應一個客戶
#一定是student來foreign key表customer,這樣就保證了:
#1 學生一定是一個客戶,
#2 客戶不一定是學生,但有可能成為一個學生

1.創建客戶表
create table customer(
id int primary key auto_increment,
name varchar(20) not null,
qq varchar(10) not null,
phone char(16) not null
);

2.創建學生表
create table student(
id int primary key auto_increment,
class_name varchar(20) not null,
customer_id int unique, #該字段一定要是唯一的
foreign key(customer_id) references customer(id) #外鍵的字段一定要保證unique
on delete cascade
on update cascade
);


3.增加客戶
insert into customer(name,qq,phone) values
(‘李飛機‘,‘31811231‘,13811341220),
(‘王大炮‘,‘123123123‘,15213146809),
(‘守榴彈‘,‘283818181‘,1867141331),
(‘吳坦克‘,‘283818181‘,1851143312),
(‘贏火箭‘,‘888818181‘,1861243314),
(‘戰地雷‘,‘112312312‘,18811431230)
;


4.增加學生
insert into student(class_name,customer_id) values
(‘脫產3班‘,3),
(‘周末19期‘,4),
(‘周末19期‘,5)
;
技術分享圖片

3.多對多

技術分享圖片
表:學生表和老師表
關系:一個學生上過多個老師的課,一個老師教過多個學生

1.創建老師表
create table teacher (id int primary key auto_increment,name char(10));

2.創建學生表
create table student (id int primary key auto_increment,name char(10));

#為了避免重復無用的關系數據  關系表加上關聯的主鍵約束
3.創建關聯表
create table t_s (t_id int,
s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id),
primary key(t_id,s_id)
);

4插入數據
insert into student value(null,"lxx");
insert into teacher value(null,"exx");
insert into t_s value(1,1);
技術分享圖片

03 數據庫入門學習-完整性約束、關聯關系