数据库原理与应用 第 11 章 · 上机一
课程第 11 章上机一 建台账装三条改电话插新供应商删最后一件拆两张搬数据再来一次连起来 版式
第 11 章 数据库设计概述及需求分析 · 上机一

台账为什么撑不住

把课件上那张采购台账原样建成一张宽表,让三种异常一个一个真的发生,再拆开重来一遍。
已完成 0 / 8
本 次 上 机 题 目
  1. 01把课件那张台账原样建成一张表
  2. 02同一个供应商供两种货
  3. 03第一种异常:改一处要动好几行
  4. 04第二种异常:想存却存不进去
  5. 05第三种异常:删一样连带没了另一样
  6. 06把供应商单独立成一张表
  7. 07三家供应商,三件商品
  8. 08同样三件事,拆完之后各是什么下场
  9. 外码拦一次,再把两种存法比一遍
01
第 11 章 · 上机一

把课件那张台账原样建成一张表

台账上印着几项,表里就写几列,先原样照搬。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
这台终端一打开就连着服务器了,当前库是 shop,直接敲 SQL 就行。
mysql>

重 点

十列里前六列讲商品,中间三列讲供应商,最后一列讲这一次进货。

想一想

三件事挤在一行里,会有什么麻烦?

02
第 11 章 · 上机一

同一个供应商供两种货

阳光供货供两种书,恒通数码供一台电脑,一共三行。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
这台终端一打开就连着服务器了,当前库是 shop,直接敲 SQL 就行。
mysql>

重 点

阳光供货的电话和邮箱一模一样地存了两遍,这就叫数据冗余。

打个比方

就像通讯录里同一个人存了两条,改一条另一条还是老号码。

03
第 11 章 · 上机一

第一种异常:改一处要动好几行

阳光供货换号了,看这一句 UPDATE 动了几行。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
这台终端一打开就连着服务器了,当前库是 shop,直接敲 SQL 就行。
mysql>

重 点

回显里 Rows matched 是 2,供几种货就要改几行,漏一行两处就对不上。

关键术语记住这个名字

修改异常update anomaly
同一个事实存了多份,改一处要动多行

想一想

如果阳光供货供一百种货,这句要动几行?

04
第 11 章 · 上机一

第二种异常:想存却存不进去

新签了一家供应商,货还没到,现在想先把它记下来。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
这台终端一打开就连着服务器了,当前库是 shop,直接敲 SQL 就行。
mysql>

重 点

报 1364,商品编号是主码又不能为空,没有货就没法记供应商。

关键术语记住这个名字

插入异常insertion anomaly
缺了不相干的那一部分,这一行就插不进

想一想

供应商信息为什么要跟着商品才存得下?

05
第 11 章 · 上机一

第三种异常:删一样连带没了另一样

恒通数码只供这一台电脑,这件货下架,看它还在不在。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
这台终端一打开就连着服务器了,当前库是 shop,直接敲 SQL 就行。
mysql>

重 点

Empty set,商品没了供应商也跟着没了,这家公司在库里查不到。

关键术语记住这个名字

删除异常deletion anomaly
删掉一件事,把另一件事也一起删没了

上机做

上机二第 1 题 拆完就没这毛病

06
第 11 章 · 上机一

把供应商单独立成一张表

供应商是一件独立的事,就该有自己的表和自己的主码。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
这台终端一打开就连着服务器了,当前库是 shop,直接敲 SQL 就行。
mysql>

重 点

商品表里只留一个供应商编号,靠外码指过去,不再抄一遍电话邮箱。

想一想

为什么外码要指主码,不能指供应商名称?

07
第 11 章 · 上机一

三家供应商,三件商品

供应商先装,商品后装,顺序反了外码会拦。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
这台终端一打开就连着服务器了,当前库是 shop,直接敲 SQL 就行。
mysql>

重 点

新元图书还没供货就先存下了,插入异常在这儿已经没了。

知道更多

g003 这一行现在一件商品都没挂上,照样是合法的一行。

08
第 11 章 · 上机一

同样三件事,拆完之后各是什么下场

电话再改一次,商品再删一次,对比刚才的回显。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
这台终端一打开就连着服务器了,当前库是 shop,直接敲 SQL 就行。
mysql>

重 点

改电话只动 1 行,商品删了供应商还在,连起来查还是台账那个样。

记牢它拆完的三句话

  1. 改一处只动一行
  2. 没供货也存得下
  3. 删商品不伤供应商

想一想

拆完之后想看完整台账,要多做哪一步?

第 11 章 · 上机一

外码拦一次,再把两种存法比一遍

往商品表里塞一个不存在的供应商编号,看它拦不拦。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
这台终端一打开就连着服务器了,当前库是 shop,直接敲 SQL 就行。
mysql>

重 点

1452,g009 这家供应商压根不存在,拆开之后这种脏数据进不来。

想一想

最后那句为什么要用 LEFT JOIN?

保山学院·人工智能教研室·曹鼎鼎