MySQL學(xué)習(xí)1:約束、存儲引擎冶忱、事務(wù)尾菇、索引、視圖囚枪、DBA命令派诬、數(shù)據(jù)庫設(shè)計三范式

約束(Constraint)

什么是約束?
在創(chuàng)建表的時候眶拉,可以給表的字段添加相應(yīng)的約束千埃,添加約束的目的是為了保證表中數(shù)據(jù)的合法性、有效性忆植、完整性放可。

常見的約束有哪些呢?
非空約束(not null):約束的字段不能為NULL
唯一約束(unique):約束的字段不能重復(fù)
主鍵約束(primary key):約束的字段既不能為NULL朝刊,也不能重復(fù)(簡稱PK)
外鍵約束(foreign key)(簡稱FK)
檢查約束(check)
注意:Oracle數(shù)據(jù)庫中有check約束耀里,但是MySQL沒有,目前MySQL不支持這個約束拾氓。

非空約束 not null

非空約束.png

唯一性約束 unique

唯一性約束修飾的字段具有唯一性冯挎,不能重復(fù)。但可以為NULL咙鞍。

案例.png

在列后面添加房官,表示列級約束趾徽。
多個字段聯(lián)合起來添加一個約束unique ,這個是表級約束

案例.png

注意:not null 約束只有列級約束翰守,沒有表級約束孵奶。

主鍵約束

怎么給一張表添加主鍵約束呢?

primary key.png

注意:主鍵字段中的數(shù)據(jù)不能為NULL蜡峰,也不能重復(fù)了袁。

主鍵的特點:不能為NULL,也不能重復(fù)湿颅。

主鍵相關(guān)的術(shù)語有哪些载绿?
主鍵約束:primary key
主鍵字段:帶有primary key的字段
主鍵值:主鍵字段中插入的那個值

主鍵有什么作用?
表的設(shè)計三范式中有要求油航,第一范式就要求任何一張表都應(yīng)該有主鍵崭庸。
主鍵的作用:主鍵值是這行記錄在這張表當(dāng)中的唯一標識。(就像一個人的身份證號碼一樣劝堪。)

主鍵的分類冀自?
根據(jù)主鍵字段的字段數(shù)量來劃分:
單一主鍵(推薦的,常用的)
復(fù)合主鍵(多個字段聯(lián)合起來添加一個主鍵約束)(復(fù)合主鍵不建議使用秒啦,因為復(fù)合主鍵違背三范式熬粗。)
根據(jù)主鍵的性質(zhì)來劃分:
自然主鍵:主鍵值最好就是一個和業(yè)務(wù)沒有任何關(guān)系的自然數(shù)。(這種方式是推薦的)
業(yè)務(wù)主鍵:主鍵值和系統(tǒng)的業(yè)務(wù)掛鉤余境,例如:拿著銀行卡的卡號做主鍵驻呐,拿著身份證號碼作為主鍵。(不推薦用)

最好不要拿著和業(yè)務(wù)掛鉤的字段作為主鍵芳来。因為以后的業(yè)務(wù)一旦發(fā)生改變的時候含末,主鍵值可能也需要隨著發(fā)生變化,但有的時候沒有辦法變化即舌,因為變化可能會導(dǎo)致主鍵值重復(fù)佣盒。

一張表的主鍵約束只能有一個。(必須記淄缒簟)

使用表級約束方式定義主鍵:

表級約束方式定義主鍵.png

演示一下復(fù)合主鍵肥惭,不需要掌握

復(fù)合主鍵.png

mysql提供主鍵值自增:(非常重要)

auto_increment

主鍵值自增.png

t提示:Oracle當(dāng)中也提供了一個自增機制,叫做:序列(sequence)對象紊搪。

外鍵約束

關(guān)于外鍵約束的相關(guān)術(shù)語:
外鍵約束:foreign key
外鍵字段:添加有外鍵約束的字段
外鍵值:外鍵字段中的每一個值蜜葱。

業(yè)務(wù)背景:
請設(shè)計數(shù)據(jù)庫表,用來維護學(xué)生和班級的信息耀石。

第一種方案.png
第二種方案.png

t_student中的classno字段引用t_class表中的cno字段牵囤,此時t_student表叫做子表。t_class表叫做父表。

順序要求:
刪除數(shù)據(jù)的時候揭鳞,先刪除子表炕贵,再刪除父表。
添加數(shù)據(jù)的時候汹桦,先添加父表鲁驶,再添加子表。
創(chuàng)建表的時候舞骆,先創(chuàng)建父表,再創(chuàng)建子表径荔。
刪除表的時候督禽,先刪除子表,在刪除父表总处。

外鍵約束:
foreign key(子表的字段) references 父表名(被引用的父表中的字段)

實現(xiàn)第二種方案的sql代碼.png

select * from t_class;
select * from t_student;

外鍵值可以為NULL狈惫。

外鍵字段引用其他表的某個字段的時候,被引用的字段不一定是主鍵鹦马,但至少具有unique約束胧谈。

存儲引擎(了解)

完整的建表語句
create table 表名(
字段名 數(shù)據(jù)類型(指定的值) default null
) engine=InnoDB default charset=utf8;

注意:在MySQL當(dāng)中,凡是標識符是可以使用飄號括起來的荸频。最好別用菱肖,不通用。

建表的時候可以指定存儲引擎旭从,也可以指定字符集稳强。

MySQL默認使用的存儲引擎是InnoDB方式。
默采用的字符集是UTF8和悦。

什么是存儲引擎呢退疫?
存儲引擎這個名字只有在MySQL中存在。(Oracle中有對應(yīng)的機制鸽素,但是不叫作存儲引擎褒繁。Oracle中沒有特殊的名字,就是“表的存儲方式”)

mysql支持很多存儲引擎馍忽,每一個存儲引擎都對應(yīng)了一種不同的存儲方式棒坏。
每一個存儲引擎都有自己的優(yōu)缺點,需要在合適的時機選擇合適的存儲引擎舵匾。

查看當(dāng)前mysql支持的存儲引擎
show engines \G

mysql 5.7.17-log版本支持的存儲引擎有9個:
*************************** 1. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL

MyISAM引擎

  Engine: MyISAM
 Support: YES
 Comment: MyISAM storage engine
 Transactions: NO
      XA: NO
   Savepoints: NO

MyISAM這種存儲引擎不支持事務(wù)呈枉。

MyISAM是mysql最常用的存儲引擎

MyISAM采用三個文件組織一張表:
xxx.frm(存儲格式的文件)
xxx.MYD(存儲表中數(shù)據(jù)的文件)
xxx.MYI(存儲表中索引的文件)

優(yōu)點:可被壓縮,節(jié)省存儲空間略水。并且可以轉(zhuǎn)換為只讀表森瘪,提高檢索效率。
缺點:不支持事務(wù)。

InnoDB存儲引擎

  Engine: InnoDB
 Support: DEFAULT
 Comment: Supports transactions, row-level locking, and foreign keys
 Transactions: YES
      XA: YES
   Savepoints: YES

優(yōu)點:支持事務(wù)谎替、行級鎖偷溺、外鍵等。這種存儲引擎數(shù)據(jù)的安全得到保障钱贯。

表得結(jié)構(gòu)存儲在xx.frm文件中

數(shù)據(jù)存儲在tablespace這樣的表空間中(邏輯概念)挫掏,無法被壓縮,無法轉(zhuǎn)換成只讀秩命。

這種InnoDB存儲引擎在MySQL數(shù)據(jù)庫崩潰之后提供自動恢復(fù)機制尉共。

InnoDB支持級聯(lián)刪除和級聯(lián)更新。

MEMORY存儲引擎

  Engine: MEMORY
 Support: YES
 Comment: Hash based, stored in memory, useful for temporary tables
  Transactions: NO
      XA: NO
    Savepoints: NO

缺點:不支持事務(wù)弃锐。數(shù)據(jù)容易丟失袄友,因為所有數(shù)據(jù)和索引都是存儲在把內(nèi)存當(dāng)中的。
優(yōu)點:查詢速度最快霹菊。
以前叫做HEPA引擎剧蚣。

面試存儲引擎的話

大概面試官要是問的話,你聽沒聽說過存儲引擎靶ⅰ鸠按?
我是這么去理解存儲引擎的,存儲引擎就相當(dāng)于是饶碘,在mysql當(dāng)中目尖,表的不同的組織方式。常見的存儲引擎有很多熊镣,我聽說過的存儲引擎有MyISAM存儲引擎卑雁,這種存儲引擎的特點是一般采用三個文件去組織這個數(shù)據(jù),有frm格式的绪囱,有MYI的测蹲,有MYD的。這種方式的優(yōu)點就是可以壓縮轉(zhuǎn)換為只讀鬼吵,節(jié)省空間扣甲。但是這種方式不支持事務(wù)。除了這個之外齿椅,還有一種存儲引擎InnoDB琉挖,這種存儲引擎是支持事務(wù)的,在mysql當(dāng)中如果沒有指定存儲引擎的話涣脚,默認采用的存儲引擎就是這種存儲引擎示辈。這種存儲引擎支持事務(wù),有數(shù)據(jù)庫崩潰之后自動恢復(fù)機制遣蚀,也支持行級鎖矾麻,也支持級聯(lián)刪除纱耻,級聯(lián)更新,這就是這種存儲引擎险耀。還有一種存儲引擎就是數(shù)據(jù)存儲在內(nèi)存當(dāng)中弄喘,索引也是存儲在內(nèi)存當(dāng)中,這種存儲引擎叫做MEMORY存儲引擎甩牺,它的優(yōu)點是檢索速度非衬⒅荆快,它的缺點是數(shù)據(jù)沒有辦法永久保存贬派,斷電之后急但,有可能數(shù)據(jù)丟失。當(dāng)然我對這個存儲引擎大概就了解這么多搞乏。更深層次的這方面我還沒有太多的研究羊始,但是如果咱們需要的話,我覺得這塊沒什么太大的問題查描。

事務(wù)(Transaction)

什么是事務(wù)?
一個事務(wù)是一個完整的業(yè)務(wù)邏輯單元柏卤,不可再分冬三。

比如:銀行賬戶轉(zhuǎn)賬,從A賬戶向B賬戶轉(zhuǎn)賬10000.需要執(zhí)行兩條update語句:
update t_act set balance = balance - 10000 where actno = 'act-001';
update t_act set balance = balance + 10000 where actno = 'act-002';
以上兩條DML語句必須同時成功缘缚,或者同時失敗勾笆,不允許出現(xiàn)一條成功,一條失敗桥滨。
要想保證以上的兩條DML語句同時成功或者同時失敗窝爪,那么就需要使用數(shù)據(jù)庫的“事務(wù)機制”。

和事務(wù)相關(guān)的語句只有:DML語句齐媒。(insert delete update)
為什么蒲每?因為它們這三個語句都是和數(shù)據(jù)庫表當(dāng)中的“數(shù)據(jù)”相關(guān)的。

事務(wù)的存在是為了保證數(shù)據(jù)的完整性喻括,安全性邀杏。

假設(shè)所有的業(yè)務(wù)都能使用1條DML語句搞定,還需要事務(wù)機制嗎唬血?
不需要事務(wù)望蜡。
但實際情況不是這樣的,通常一個“事兒(事務(wù)【業(yè)務(wù)】)”需要多條DML語句共同聯(lián)合完成拷恨。

事務(wù)的特性

事務(wù)包括四大特性:ACID
A: 原子性:事務(wù)是最小的工作單元脖律,不可再分。
C: 一致性:事務(wù)必須保證多條DML語句同時成功或者同時失敗腕侄。
I:隔離性:事務(wù)A與事務(wù)B之間具有隔離小泉。
D:持久性:持久性說的是最終數(shù)據(jù)必須持久化到硬盤文件中芦疏,事務(wù)才算成功的結(jié)束。

關(guān)于事務(wù)之間的隔離性

事務(wù)隔離性存在隔離級別膏孟,理論上隔離級別包括4個:
第一級別:讀未提交(read uncommitted)
對方事務(wù)還沒有提交眯分,我們當(dāng)前事務(wù)可以讀取到對方未提交的數(shù)據(jù)。
讀未提交存在臟讀(Dirty Read)現(xiàn)象:表示讀到了臟的數(shù)據(jù)柒桑。

第二級別:讀已提交(read committed)
對方事務(wù)提交之后的數(shù)據(jù)我方可以讀取到弊决。
這種隔離級別解決了: 臟讀現(xiàn)象沒有了。
讀已提交存在的問題是:不可重復(fù)讀魁淳。

第三級別:可重復(fù)讀(repeatable read)
這種隔離級別解決了:不可重復(fù)讀問題飘诗。
這種隔離級別存在的問題是:讀取到的數(shù)據(jù)是幻象。

第四級別:序列化讀/串行化讀(serializable)
解決了所有問題界逛。
效率低昆稿。需要事務(wù)排隊。

oracle數(shù)據(jù)庫默認的隔離級別是:讀已提交息拜。(read committed)
mysql數(shù)據(jù)庫默認的隔離級別是:可重復(fù)讀溉潭。(repeatable read)

演示事務(wù)

mysql事務(wù)默認情況下是自動提交的。

什么是自動提交少欺?
只要執(zhí)行任意一條DML語句則提交一次喳瓣。

怎么關(guān)閉自動提交?
start transaction;

準備表:
drop table if exists t_user;
create table t_user(
id int primary key auto_increment,
username varchar(255)
);

演示:mysql中的事務(wù)是支持自動提交的赞别,只要執(zhí)行一條DML畏陕,則提交一次。
mysql> insert into t_user(username) values('zs');
Query OK, 1 row affected (0.03 sec)

mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
+----+----------+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
+----+----------+
1 row in set (0.00 sec)

演示:使用start transaction;關(guān)閉自動提交機制仿滔。
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_user(username) values('lisi');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 2 | lisi |
+----+----------+
2 rows in set (0.00 sec)

mysql> insert into t_user(username) values('wangwu');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 2 | lisi |
| 3 | wangwu |
+----+----------+
3 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.02 sec)

mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
+----+----------+
1 row in set (0.00 sec)


mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_user(username) values('wangwu');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_user(username) values('rose');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_user(username) values('jack');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 4 | wangwu |
| 5 | rose |
| 6 | jack |
+----+----------+
4 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.04 sec)

mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 4 | wangwu |
| 5 | rose |
| 6 | jack |
+----+----------+
4 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | zs |
| 4 | wangwu |
| 5 | rose |
| 6 | jack |
+----+----------+
4 rows in set (0.00 sec)

演示兩個事務(wù)惠毁,假如隔離級別
演示第1級別:讀未提交、
設(shè)置事務(wù)的全局隔離級別:
set global transaction isolation level read uncommitted;
查看事務(wù)的全局隔離級別:(mysql5.5.6)
select @@global.tx_isolation;

第一隔離級別.png

演示第2級別:讀已提交
set global transaction isolation level read committed;

演示第3級別:可重復(fù)讀
set global transaction isolation level repeatable read;

演示第4級別:串行化讀
set global transaction isolation level serializable;

mysql遠程登錄:mysql -h IP地址 -uroot -p密碼

索引

什么是索引崎页?有什么用鞠绰?
索引就相當(dāng)于一本書的目錄,通過目錄可以快速的找到對應(yīng)的資源实昨。
在數(shù)據(jù)庫方面洞豁,查詢一張表的時候有兩種檢索方式:
第一種方式:全表掃描
第二種方式:根據(jù)索引檢索(效率很高)

索引為什么可以提高檢索效率呢?
其實最根本的原理是縮小了掃描的范圍荒给。

索引雖然可以提高檢索效率丈挟,但是不能隨意的添加索引,因為索引也是數(shù)據(jù)庫當(dāng)中的對象志电,也需要數(shù)據(jù)庫不斷的維護曙咽。是有維護成本的。比如挑辆,表中的數(shù)據(jù)經(jīng)常被修改例朱。
這樣就不適合添加索引孝情,因為數(shù)據(jù)一旦修改,索引需要重新排序洒嗤,進行維護箫荡。

添加索引是給某一個字段,或者說某些字段添加索引渔隶。

select ename,sal from emp where ename = 'SMITH';
當(dāng)ename字段上沒有添加索引的時候羔挡,以上sql語句會進行全表掃描,掃描ename字段中所有的值间唉。
當(dāng)ename字段上添加索引的時候绞灼,以上sql語句會根據(jù)索引掃描,快速定位呈野。

怎么創(chuàng)建索引對象低矮?怎么刪除索引對象?
創(chuàng)建索引對象:
create index 索引名稱 on 表名(字段名);
刪除索引對象:
drop index 索引名稱 on 表名;

什么時候考慮給字段添加索引被冒?(滿足什么條件)
數(shù)據(jù)量龐大军掂。(根據(jù)客戶的需求,根據(jù)線上的環(huán)境)
該字段很少的DML操作昨悼。(因為字段進行修改操作良姆,索引也需要維護)
該字段經(jīng)常出現(xiàn)在where子句中。(經(jīng)常根據(jù)哪個字段查詢)

注意:主鍵和具有unique約束的字段自動會添加索引幔戏。
所以說,根據(jù)主鍵查詢效率較高税课。盡量根據(jù)主鍵檢索闲延。

查看sql語句的執(zhí)行計劃:
mysql> explain select ename,sal from emp where sal = 5000;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | emp | ALL | NULL | NULL | NULL | NULL | 14 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

給薪資sal字段添加索引:
create index emp_sal_index on emp(sal);

mysql> explain select ename,sal from emp where sal = 5000;
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
| 1 | SIMPLE | emp | ref | emp_sal_index | emp_sal_index | 9 | const | 1 | Using where |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+

索引底層采用的數(shù)據(jù)結(jié)構(gòu)是:B + Tree

索引的實現(xiàn)原理?

索引的實現(xiàn)原理.png

通過B Tree縮小掃描范圍韩玩,底層索引進行了排序垒玲,分區(qū),索引會攜帶數(shù)據(jù)在表中的“物理地址”找颓,最終通過索引檢索到數(shù)據(jù)之后合愈,獲取到關(guān)聯(lián)的物理地址,通過物理地址定位表中的數(shù)據(jù)击狮,效率是最高的佛析。
select ename from emp where ename = 'SMITH';
通過索引轉(zhuǎn)換為:
select ename from emp where 物理地址 = 0x3;

索引的分類?
單一索引:給單個字段添加索引
復(fù)合索引: 給多個字段聯(lián)合起來添加1個索引
主鍵索引:主鍵上會自動添加索引
唯一索引:有unique約束的字段上會自動添加索引
....

索引什么時候失效彪蓬?
select ename from emp where ename like '%A%';
模糊查詢的時候寸莫,第一個通配符使用的是%,這個時候索引是失效的档冬。

視圖view

什么是視圖膘茎?
站在不同的角度去看到數(shù)據(jù)桃纯。(同一張表的數(shù)據(jù),通過不同的角度去看待)披坏。

怎么創(chuàng)建視圖态坦?怎么刪除視圖?
創(chuàng)建視圖:
create view myview as select empno,ename from emp;
刪除視圖:
drop view myview;

注意:只有DQL語句才能以視圖對象的方式創(chuàng)建出來棒拂。

對視圖進行增刪改查伞梯,會影響到原表數(shù)據(jù)。(通過視圖影響原表數(shù)據(jù)的着茸,不是直接操作的原表)
可以對視圖進行CRUD操作壮锻。

面向視圖操作?
mysql> select * from myview;
+-------+--------+
| empno | ename |
+-------+--------+
| 7369 | SMITH |
| 7499 | ALLEN |
| 7521 | WARD |
| 7566 | JONES |
| 7654 | MARTIN |
| 7698 | BLAKE |
| 7782 | CLARK |
| 7788 | SCOTT |
| 7839 | KING |
| 7844 | TURNER |
| 7876 | ADAMS |
| 7900 | JAMES |
| 7902 | FORD |
| 7934 | MILLER |
+-------+--------+
//創(chuàng)建一個emp_bak表
create table emp_bak as select * from emp;
//把后面的語句當(dāng)作視圖創(chuàng)建出來
create view myview1 as select empno,ename,sal from emp_bak;
update myview1 set ename='hehe',sal=1 where empno = 7369; // 通過視圖修改原表數(shù)據(jù)涮阔。
delete from myview1 where empno = 7369; // 通過視圖刪除原表數(shù)據(jù)猜绣。

視圖的作用?
視圖可以隱藏表的實現(xiàn)細節(jié)敬特。保密級別較高的系統(tǒng)掰邢,數(shù)據(jù)庫只對外提供相關(guān)的視圖,java程序員只對視圖對象進行CRUD伟阔。

DBA命令(了解)

將數(shù)據(jù)庫當(dāng)中的數(shù)據(jù)導(dǎo)出
在windows的dos命令窗口中執(zhí)行:(導(dǎo)出整個庫)
mysqldump SQL文件名>D:\SQL文件名.sql -uroot -p密碼

在windows的dos命令窗口中執(zhí)行:(導(dǎo)出指定數(shù)據(jù)庫當(dāng)中的指定表)
mysqldump SQL文件名 表名>D:\SQL文件名.sql -uroot –p密碼

導(dǎo)入數(shù)據(jù)
create database SQL文件名;
use SQL文件名;
source 存放SQL文件的路徑

數(shù)據(jù)庫設(shè)計三范式(重點辣之,面試常問)

什么是設(shè)計范式?
設(shè)計表的依據(jù)皱炉。按照這個三范式設(shè)計的表不會出現(xiàn)數(shù)據(jù)冗余怀估。

三范式都是哪些?

第一范式:任何一張表都應(yīng)該有主鍵合搅,并且每一個字段原子性不可再分多搀。

第二范式:建立在第一范式的基礎(chǔ)之上,所有非主鍵字段完全依賴主鍵灾部,不能產(chǎn)生部分依賴康铭。

多對多?三張表赌髓,關(guān)系表兩個外鍵从藤。
t_student學(xué)生表
sno(pk) sname


1 張三
2 李四
3 王五

t_teacher 講師表
tno(pk) tname


1 王老師
2 張老師
3 李老師

t_student_teacher_relation 學(xué)生講師關(guān)系表
id(pk) sno(fk) tno(fk)


1 1 3
2 1 1
3 2 2
4 2 3
5 3 1
6 3 3

第三范式:建立在第二范式的基礎(chǔ)之上,所有非主鍵字段直接依賴主鍵锁蠕,不能產(chǎn)生傳遞依賴夷野。

一對多?兩張表荣倾,多的表加外鍵扫责。
班級t_class
cno(pk) cname


1 班級1
2 班級2

學(xué)生t_student
sno(pk) sname classno(fk)


101 張1 1
102 張2 1
103 張3 2
104 張4 2
105 張5 2

提醒:在實際的開發(fā)中,以滿足客戶的需求為主逃呼,有的時候會拿冗余換執(zhí)行速度鳖孤。

一對一怎么設(shè)計者娱?

一對一設(shè)計有兩種方案:主鍵共享
t_user_login 用戶登錄表
id(pk) username password


1 zs 123
2 ls 456

t_user_detail 用戶詳細信息表
id(pk+fk) realname tel ....


1 張三 1111111111
2 李四 1111415621

一對一設(shè)計有兩種方案:外鍵唯一。
t_user_login 用戶登錄表
id(pk) username password


1 zs 123
2 ls 456

t_user_detail 用戶詳細信息表
id(pk) realname tel userid(fk+unique)....


1 張三 1111111111 2
2 李四 1111415621 1

口訣:
一對一兩種方案:主鍵共享和外鍵唯一苏揣。
一對多黄鳍,兩張表,多的表加外鍵平匈。
多對多框沟,三張表,關(guān)系表兩個外鍵增炭。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忍燥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子隙姿,更是在濱河造成了極大的恐慌梅垄,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件输玷,死亡現(xiàn)場離奇詭異队丝,居然都是意外死亡,警方通過查閱死者的電腦和手機欲鹏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門机久,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赔嚎,你說我怎么就攤上這事膘盖。” “怎么了尤误?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵衔憨,是天一觀的道長。 經(jīng)常有香客問我袄膏,道長,這世上最難降的妖魔是什么掺冠? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任沉馆,我火速辦了婚禮,結(jié)果婚禮上德崭,老公的妹妹穿的比我還像新娘斥黑。我一直安慰自己,他們只是感情好眉厨,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布锌奴。 她就那樣靜靜地躺著,像睡著了一般憾股。 火紅的嫁衣襯著肌膚如雪鹿蜀。 梳的紋絲不亂的頭發(fā)上箕慧,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機與錄音茴恰,去河邊找鬼颠焦。 笑死,一個胖子當(dāng)著我的面吹牛往枣,可吹牛的內(nèi)容都是我干的伐庭。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼分冈,長吁一口氣:“原來是場噩夢啊……” “哼圾另!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雕沉,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤集乔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蘑秽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饺著,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年肠牲,在試婚紗的時候發(fā)現(xiàn)自己被綠了幼衰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡缀雳,死狀恐怖渡嚣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肥印,我是刑警寧澤识椰,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站深碱,受9級特大地震影響腹鹉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敷硅,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一功咒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绞蹦,春花似錦力奋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春猿挚,著一層夾襖步出監(jiān)牢的瞬間咐旧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工亭饵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留休偶,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓辜羊,卻偏偏與公主長得像踏兜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子八秃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容