第1步:设计

首先要设计一张用于我想要用途的表,例如如下用于描述个人的信息类型:

  • 姓名;
  • 性别;
  • 出生日期;
  • 地址;
  • 最喜爱的食物。

下面为他来指定列和数据类型:

类型 允许值
name varchar(40)
gender char(1) M,F
birth_date date
address varchar(100)
favorite_foods varchar(200)

其中,name、address 和 favorite_foods 列的类型为varchar,容许不同形式的数据条目,而

gender列则只允许单个字母M或F。birth_date为日期类型,因为此处并不需要精确到具体的时间。

第2步:精化

进一步观察person表,会发现如下问题:

  • name列实际上是包含了姓氏和名字的复合对象。
  • 可能存在多个人具有相同的名字、性别、生日等,而person表中并没有列来保证唯一性。
  • address列也是包含了街道、省名、县市名和邮政编码的符合对象。
  • favorite_foods列可以是包含0、1或更多条目的列表,因此最好为此数据创建一个独立的表,其中包含一个指向person表的外键,以便为每一种食物知名所归属的人员。

考虑这些问题之后,列出person规范化后的结果:

person表

类型 允许值
person_id smallint(unsigned)
first_name varchar(20)
last_name varchar(20)
gender char(1) M,F
birth_date date
street varchar(30)
city varchar(20)
state varchar(20)
county varchar(20)
postal_code varchar(20)

现在person表已经具有了主键(person_id)来保证唯一性,下一步便是建立favorite_food表,其中包含一个执行person表的外键:

favorite_food表

类型
person_id smallint(unsigned)
food varchar(20)

person_id 和 food 列构成了 favorite_food表的主键,并且person_id列也是person表的外键。

第3步:构建SQL方案语句

创建 person 表的语句如下:

  1. CREATE TABLE person
  2. (
  3. person_id SMALLINT UNSIGNED,
  4. fname VARCHAR(20),
  5. lname VARCHAR(20),
  6. gender CHAR(1),
  7. birth_date DATE,
  8. street VARCHAR(30),
  9. city VARCHAR(20),
  10. state VARCHAR(20),
  11. country VARCHAR(20),
  12. postal_code VARCHAR(20),
  13. CONSTRAINT pk_person PRIMARY KEY (person_id)
  14. );

最下面的一个语句(CONSTRAINT pk_person PRIMARY KEY (person_id))用于指定一个约束,他创建了一个名为

pk_person的约束(constraint),其创建在 person_id 之上。

对于性别(gender)这一列来说,可以为其添加约束,使其只能是'M'或者'F'。可以使用 检查约束 或者 enum

检查约束

为该列添加一个检查约束,以限制该列只存放被允许的值。MySQL允许在定义列时关联一个检查约束,如下所示:

  1. gender CHAR(1) CHECK (gender IN ('M','F')),

enum

MySQL提供了另一种名为 enum 的字符数据类型,它可以将检查约束与数据类型定义融合在一起,此方法的定义如下:

  1. gender ENUM('M','F'),

下面是重新定义了的person表,其中使用enum作为gender列的数据类型:

  1. CREATE TABLE person
  2. (
  3. person_id SMALLINT UNSIGNED,
  4. fname VARCHAR(20),
  5. lname VARCHAR(20),
  6. gender ENUM('M','F'),
  7. birth_date DATE,
  8. street VARCHAR(30),
  9. city VARCHAR(20),
  10. state VARCHAR(20),
  11. country VARCHAR(20),
  12. postal_code VARCHAR(20),
  13. CONSTRAINT pk_person PRIMARY KEY (person_id)
  14. );

可以通过DESC person命令(或者DESCRIBE person命令)来查看person表的详细信息。结果如下:

  1. +-------------+----------------------+------+-----+---------+-------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +-------------+----------------------+------+-----+---------+-------+
  4. | person_id | smallint(5) unsigned | NO | PRI | NULL | |
  5. | fname | varchar(20) | YES | | NULL | |
  6. | lname | varchar(20) | YES | | NULL | |
  7. | gender | enum('M','F') | YES | | NULL | |
  8. | birth_date | date | YES | | NULL | |
  9. | street | varchar(30) | YES | | NULL | |
  10. | city | varchar(20) | YES | | NULL | |
  11. | state | varchar(20) | YES | | NULL | |
  12. | country | varchar(20) | YES | | NULL | |
  13. | postal_code | varchar(20) | YES | | NULL | |
  14. +-------------+----------------------+------+-----+---------+-------+

其中第1列和第2列的结果是显而易见的。

第3列显示该列是否允许在插入数据时被省略。

第4列显示该列是否作为键值(主键或外键),本例中 person_id 列被标记为主键。

第5列显示如果在插入数据时忽略该列,是否向其提供默认值。

第6列("Extrra")显示该列附加的说明信息。

接下来创建 favorite_foods 表:

favorite_foods表

  1. CREATE TABLE favorite_food
  2. (
  3. person_id SMALLINT UNSIGNED,
  4. food VARCHAR(20),
  5. CONSTRAINT pk_favorite_food PRIMARY KEY (person_id, food),
  6. CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
  7. REFERENCES person (person_id)
  8. );

除了有以下不同之外,它与前面 person 表的 create table 语句十分类似:

  • 由于一个人可能有多种喜爱的食物(当然这也是创建此表的原因),仅靠 person_id 列不能保证数据的唯一性,因此本表的逐渐包含两列:person_id 和 food。
  • favorite_food 包含了另一种类型的约束,及外键约束,它限制了favorite表中person_id列的值只能够来自person表。通过这种约束,使得当person表中没有person_id为33的记录时,向favorite_food表中增加person_id为33、喜爱食物为披萨的数据行是不可能的。
  • 同理,如果要删除person表中一个id为3的人,则需要先删除favorite_food表中person_id为3的所有信息,再去删除person表中的数据。(不过好像有一个去除关联的方法)

在执行完create table语句后,使用describe命令可以显示下面的结果:

  1. +-----------+----------------------+------+-----+---------+-------+
  2. | Field | Type | Null | Key | Default | Extra |
  3. +-----------+----------------------+------+-----+---------+-------+
  4. | person_id | smallint(5) unsigned | NO | PRI | NULL | |
  5. | food | varchar(20) | NO | PRI | NULL | |
  6. +-----------+----------------------+------+-----+---------+-------+

MySQL表的创建的更多相关文章

  1. Django之集合函数使用与mysql表的创建特殊字段分析

    1. 集合函数的使用场景: -- 单独使用: 不分组, 只查聚合结果 -- 分组使用: 按字段分组, 可查询分组字段与聚合结果 2. 导入聚合函数 from django.db.models impo ...

  2. MySQL表的创建和表中数据操作

    这篇文章主要介绍在navicat的命令界面操作mysql.主要涉及建立表结构,和对表中数据的增加删除修改查询等动作.站在一个新手角度的简单mysql表结构和数据操作. ☆ 准备工作 1,保证自己的电脑 ...

  3. mysql表的创建、查看、修改、删除

    一.创建表 创建表前先使用use 数据库名进入某一个数据库,创建表语句的格式如下: create table 表名称 ( 列名1 列的数据类型 [约束], 列名2 列的数据类型 [约束], 列名2 列 ...

  4. MySQL表的创建与维护

    一.导入测试数据 [root@server ~]# wget https://launchpadlibrarian.net/24493586/employees_db-full-1.0.6.tar.b ...

  5. mysql表的创建和删除

    在创建数据库表时,最好是在编辑器中写好创建表的代码,然后粘贴到命令行中,这样如果有错修改起来方便. 现在来创建一个user表: -- 打开数据库, --后面必须要有空格, 表示注释 USE mydb3 ...

  6. MySQL 表的创建、修改、删除

    1.创建表 create table 表名 ( 列名 类型 是否可以为空 列名 类型 是否可以为空 ) engine=innodb default charset=utf8; 是否可以为控制.null ...

  7. PHP 创建 MySQL 表

    CREATE TABLE 语句用于创建 MySQL 表. 创建表前,我们需要使用 use myDB 来选择要操作的数据库: use myDB; 我们将创建一个名为 "MyGuests&quo ...

  8. Django之mysql表单操作

    在Django之ORM模型中总结过django下mysql表的创建操作,接下来总结mysql表记录操作,包括表记录的增.删.改.查. 1. 添加表记录 class UserInfo(models.Mo ...

  9. Mysql 查看、创建、更改 数据库和表

    一.一探究竟 我想看看有多少个数据库,有多少个表,以及表里有啥东西.那么你可以这样: 图形界面: 命令: 查看多少个数据库:注意 后面带s #查看 SHOW DATABASES; #查看表 USE b ...

随机推荐

  1. Redis数据过期策略

    1.Redis中key的的过期时间 通过EXPIRE key seconds命令来设置数据的过期时间.返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间.在key上设置了过期时间后ke ...

  2. KVM之五:KVM日常管理常用命令

    1.查看.编辑及备份KVM 虚拟机配置文件 以及查看KVM 状态: 1.1.KVM 虚拟机默认的配置文件在 /etc/libvirt/qemu 目录下,默认是以虚拟机名称命名的.xml 文件,如下,: ...

  3. HashMap的底层原理

    简单说: 底层原理就是采用数组加链表: 两张图片很清晰地表明存储结构: 既然是线性数组,为什么能随机存取?这里HashMap用了一个小算法,大致是这样实现: // 存储时: int hash = ke ...

  4. 小程序之Tab切换

    小程序越来越火了,作为一名,额  有理想的攻城狮,当然要紧跟互联网时代的步伐啦,于是我赶紧抽时间学习了一下小程序的开发,顺便把经验分享给大家. 对于申请账号以及安装开发工具等,大家可以看官网:http ...

  5. Alpha冲刺No.7

    一.站立式会议 彻底完成初步的界面设计 实现界面的简单跳转 完成部分事件监听 移植摄像头.图库功能到真实手机环境测试 数据库上传获取日记 二.项目实际进展 完成了简单的界面设计 大致完成了跳转任务 数 ...

  6. IIS 错误代码

    错误码: 1.HTTP 1xx-信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应. 100-继续. 101-切换协议. 2xx-成功 这类状态代码表明服务 ...

  7. python 闭包计算移动均值及nonlocal的使用

    class Averager1(): '''计算移动平均值的类第一种写法''' def __init__(self): self.series = [] def __call__(self,new_v ...

  8. 关于webService发布的wsdl中的import问题解决

    大家都知道jdk1.6及以后都支持了对webService的原生态的支持:它在发布时会生成一个wsdl和一个xsd(一个类只生成一个xsd)所以就保留了引用关系,如下: <?xml versio ...

  9. ResNet

     上图为单个模型 VGGNet, GoogleNet 都说明了深度对于神经网络的重要性. 文中在开始提出: 堆叠越多的层, 网络真的能学习的越好吗? 然后通过神经网络到达足够深度后出现的退化(deg ...

  10. js 中bind

    function fn(a){ this.innerHTML = a; console.log(this); } //fn("hello"); span1.onclick =fun ...