Mysql資料庫約束和三大正規化

2021-09-26 23:05:41 字數 3945 閱讀 6745

show databases;

use db;

show tables;

select * from stu;

-- 約束 : 主鍵約束 primary key 非空且唯一

-- 非空約束 not null

-- 唯一約束 unique

-- 外來鍵約束 foreign key

create table stu2 (id int primary key, name varchar(20) not null,address varchar(77));

select * from stu2;

insert into stu2 values ( 1, "liang","biejing");

-- 修改表中的約束

alter table stu2 modify address varchar(20) unique;

select * from stu2;

insert into stu2 values (2,"shu","beijing");

select * from stu2;

insert into stu2 values (3,"cheng", "shanghai");

select * from stu2;

-- 刪除 唯一約束 不能使用modify

alter table stu2 drop index address;

-- 再建立表之後新增唯一約束alter

alter table stu2 modify address varchar(20) unique;

-- 刪除主鍵

alter table stu2 drop primary key ;

-- 在建立表之後新增主鍵

alter table stu2 modify id int primary key;

-- 實現自動增長

alter table stu2 modify id int primary key auto_increment;

insert into stu2 values ( null,"python","nihao") ;

select * from stu2;

show create table stu2;

-- 外來鍵約束

-- 建立部門表(id,dep_name,dep_location) -- 一方,主表

create table department( id int primary key auto_increment, dep_name varchar(20), dep_location varchar(20) );

-- 建立員工表(id,name,age,dep_id) -- 多方,從表

create table employee( id int primary key auto_increment, name varchar(20), age int, dep_id int ,

constraint emp_dept_fk foreign key (dep_id) references department(id));

-- 新增2個部門

insert into department values(null, '研發部','廣州'),

(null, '銷售部', '深圳'); select * from department;

-- 新增員工,dep_id表示員工所在的部門

insert into employee (name, age, dep_id) values ('張三', 20, 1);

insert into employee (name, age, dep_id) values ('李四', 21, 1);

insert into employee (name, age, dep_id) values ('王五', 20, 1);

insert into employee (name, age, dep_id) values ('老王', 20, 2);

insert into employee (name, age, dep_id) values ('大王', 22, 2);

insert into employee (name, age, dep_id) values ('小王', 18, 2);

select *from employee;

drop table employee;

drop table department;

select * from employee;

select *from department;

alter table employee drop foreign key emp_dept_fk;

-- 新增外來鍵 一對多的時候 員工和部門之間就是 多對一的關係 我們在多的一地方放置一的主鍵 作為外來鍵

-- 並且設定級聯操作

alter table employee add constraint hhh_em foreign key (dep_id) references department(id) on update cascade on delete cascade;

1.  一對一的關係:人和身份證之間的關係

吧處理方式 :可以再任意一方新增外來鍵, 我個人認為 完全可以用一張表來表示 ,並且使得這個外來鍵唯一約束 unique

2. 一對多的關係 :例如員工和部門之間的關係 , 乙個員工對應乙個部門 , 乙個部門可以的對應個員我們在設計表的時候** 再多的一放建立外來鍵 放置一的一放的主鍵 讓他們產生關聯*

constraint 外鍵名 foreign key (從表的主鍵) references departement(主表的主鍵);

3. 多對多的關係: 例子:學生和課程之間 就是多對多的關係, 我們通過建立聯合主鍵的方式, (也就是建立第三張表 裡面放置對方的主鍵 )

## 第一正規化 ##

1. 每一列都是不可分割的原子項資料(列是唯一的 不存在兩個列,不是符合列

2. 存在的問題:資料冗餘重複的太多了 ,資料新增和刪除 會產生不合法的資料

----------

## 第二正規化 ##

### 在1nf的基礎上 非屬性碼 必須完全依賴於候選碼(消除非主屬性對主碼的部分函式依賴)消除部分依賴 ###

1. 函式依賴:如果a--> b 如果通過a的屬性推倒出唯一的b 就說b依賴於a;學號——> 姓名

2. 完全函式依賴: (學號, 課程名稱)--> 分數 前面的就是乙個屬性組

a---> b a是乙個屬性組則 b屬性推倒確定需要依據a中屬性組的所有d的屬性值

3.部分函式依賴:屬性組中的某乙個屬性組可以確定b屬性的的值---a(學號, 課程名稱)--> b分數

4. 傳遞函式依賴: a——>b b-->c 就可以說c傳遞函式與a;

學號————>院系名--> 院長

5.碼:屬性或者屬性組 被其他屬性完全依賴, 就說這個屬性(屬性組) 為該錶的碼

----------

## 第三正規化 ##(**消除傳遞依賴**)

如圖所示:1nf解決的是:保證列的原子性  保證沒有復合列 就變成了如下的**

mysql三大正規化 答案 資料庫三大正規化通俗理解

資料庫三大正規化通俗理解 1 原子性,要求屬性具有原子性,不可再分解。表 欄位1 欄位2 欄位2.1 欄位2.2 欄位3 如學生 學號,姓名,性別,出生年月日 如果認為最後一列還可以再分成 出生年,出生月,出生日 它就不是一正規化了,否則就是 2 唯一性,乙個表只能說明乙個事物,即實體的惟一性。表 ...

mysql三大正規化的概念 資料庫三大正規化

何為正規化 顧名思義,規範的方式。資料庫作為底層的儲存系統,直接影響業務層的效能,因此,為了能夠讓開發人員科學規範地使用資料庫,三大正規化應運而生。本文將以較為簡潔的文字並舉例描述三大正規化。第一正規化 1nf 第一正規化是指關係表r中的每列都是原子不可分的項,即每個屬性都是最基本的資料項。這裡用 ...

資料庫三大正規化和五大約束(概念)

1 資料表中的每一列 字段 必須是不可拆分的最小單元,即確保每一列的原子性。滿足第一正規化是關係模式規範化的最低要求。2 兩列的屬性相近或相似或一樣,盡量合併屬性一樣的列,確保不產生冗餘資料。滿足1nf後要求表中的所有列,每一行的資料只能與其中一列相關,即一行資料只做一件事。只要資料列 現資料重複,...