第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 表的语句如下:

CREATE TABLE person

(

person_id SMALLINT UNSIGNED,

fname VARCHAR(20),

lname VARCHAR(20),

gender CHAR(1),

birth_date DATE,

street VARCHAR(30),

city VARCHAR(20),

stateVARCHAR(20),

countryVARCHAR(20),

postal_codeVARCHAR(20),

CONSTRAINT pk_person PRIMARY KEY (person_id)

);

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

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

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

检查约束

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

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

enum

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

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

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

CREATE TABLE person

(

person_idSMALLINT UNSIGNED,

fname VARCHAR(20),

lname VARCHAR(20),

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

birth_date DATE,

street VARCHAR(30),

city VARCHAR(20),

stateVARCHAR(20),

countryVARCHAR(20),

postal_codeVARCHAR(20),

CONSTRAINT pk_person PRIMARY KEY (person_id)

);

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

+-------------+----------------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------------+----------------------+------+-----+---------+-------+

| person_id | smallint(5) unsigned | NO | PRI | NULL | |

| fname | varchar(20) | YES | | NULL | |

| lname | varchar(20) | YES | | NULL | |

| gender | enum('M','F') | YES | | NULL | |

| birth_date | date | YES | | NULL | |

| street | varchar(30) | YES | | NULL | |

| city | varchar(20) | YES | | NULL | |

| state | varchar(20) | YES | | NULL | |

| country | varchar(20) | YES | | NULL | |

| postal_code | varchar(20) | YES | | NULL | |

+-------------+----------------------+------+-----+---------+-------+

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

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

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

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

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

接下来创建 favorite_foods 表:

favorite_foods表

CREATE TABLE favorite_food

(

person_id SMALLINT UNSIGNED,

food VARCHAR(20),

CONSTRAINT pk_favorite_food PRIMARY KEY (person_id, food),

CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)

REFERENCES person (person_id)

);

除了有以下不同之外,它与前面 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命令可以显示下面的结果:

+-----------+----------------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-----------+----------------------+------+-----+---------+-------+

| person_id | smallint(5) unsigned | NO | PRI | NULL | |

| food | varchar(20) | NO | PRI | NULL | |

+-----------+----------------------+------+-----+---------+-------+

mysql怎么创建出生日期表_MySQL表的创建相关推荐

  1. mysql创建外键的表_Mysql表创建外键报错解决方案

    Mysql表创建外键报错解决方案,字段,名字,数据库,更新时间,歧义 Mysql表创建外键报错解决方案 易采站长站,站长之家为您整理了Mysql表创建外键报错解决方案的相关内容. 数据库表A: CRE ...

  2. mysql数据库的创建外键_Mysql表创建外键报错解决方案

    数据库表A: CREATE TABLE task_desc_tab ( id INT(11) PRIMARY KEY NOT NULL COMMENT '自增主键' AUTO_INCREMENT, t ...

  3. mysql用命令行创建表_mysql命令行创建表

    命令来查看表中的数据的变化: mysql>select*from students; 7.用文本方式将数据装入一个数据库表: 创建一个文本文件"student.sql",每行 ...

  4. mysql 锁定表_MySQL表锁定

    在本教程中,您将学习如何使用MySQL锁来协调会话之间的表访问. MySQL允许客户端会话明确获取表锁,以防止其他会话在特定时间段内访问表.客户端会话只能为自己获取或释放表锁.它不能获取或释放其他会话 ...

  5. 数据库mysql的注释怎么加_mysql表如何添加字段注释

    mysql表添加字段注释的方法:直接在创建表的时候添加字段,代码为[CREATE TABLE userinfo(id INT COMMENT '编号',uname VARCHAR(40) COMMEN ...

  6. mysql 删除字段的注释_MySQL表和列的注释总结

    像代码一样,可以为表以及表中的列添加注释,方便其他人知晓其功能.对于一些字段,在经过一定时间后,创建者未必也能想起其具体的含意,所以注释显得尤为重要. 注释的添加 注释的添加是通过在定义表或列的时候在 ...

  7. mysql 建表覆盖原先表_mysql表与表之间建关系

    一对多 定义一张部门员工表 id name gender dep_name dep_desc 1 yzy male 教学部 教书育人 2 yolo male 外交部 形象大使 3 zmm female ...

  8. MySQL配置大小写敏感报错_mysql表名大小写敏感 - xbuding: watch and learn! - OSCHINA - 中文开源技术交流社区...

    在ubuntu下安装的mysql版本是 5.6.25-0ubuntu1 linux下的mysql的表名是大小写敏范的.而在在windows下安装的mysql是大小写不敏感的. 原因是因为lower_c ...

  9. mysql 锁定表_mysql表锁定技术

    如何进行MySQL数据库表的故障检测 如何修复MySQL数据库表 锁定表的方法 防止客户机的请求互相干扰或者服务器与维护程序相互干扰的方法主要有多种.如果你关闭数据库,就可以保证服务器和myisamc ...

最新文章

  1. linux out of memory分析(OOM)
  2. 理解 Delphi 的类(十) - 深入方法[9] - 调用时的括号
  3. [html] 如何给input的右上角加个清除的按钮?
  4. Scala入门到精通——第五节 函数与闭包
  5. cocos2dx开发之util类方法——字符串替换
  6. 的watch什么时候触发_Vue中computedamp;methodamp;watch的区别
  7. 12.性能之巅 洞悉系统、企业与云计算 --- 基准测试
  8. Leetcode200岛屿数量(深搜)
  9. 等宽字体 Monospaced Font
  10. android心率曲线绘制,巧妙绘制心率曲线图的方法实践
  11. -webkit-内核兼容处理
  12. win10蓝屏代码_电脑蓝屏代码在哪看?如何解决
  13. hostapd配置解析
  14. 软件功能测试概论(课堂练习1)
  15. 【综合笔试题】难度 3/5,挺有意思的一道题(既可图论,也可贪心)
  16. kengoro机器人哪儿有卖_日本东京大学创造出“骨格精奇”的机器人Kengoro 会流汗能做掌上压...
  17. TVS 管 和TSS管
  18. python元组赋值_【Python】元组的基本使用
  19. 什么是区块链?CNS积分怎么赚钱
  20. 类与对象——Java程序设计基础

热门文章

  1. 得物多活架构设计之路由服务设计
  2. 将无限循环小数化成分数
  3. cuda10.1+pytorch1.7配置centernet环境
  4. AVFrame转QImage最佳方法
  5. 【橙子】C#Winform--贪吃蛇是个人就看的懂的完整无bug逻辑代码
  6. 2017小红书校园招聘面试经历
  7. 高效学 C++|函数参数的引用传递和函数重载
  8. JAVA计算机毕业设计城市交通海量数据管理系统Mybatis+系统+数据库+调试部署
  9. 前端js数据加密解密
  10. Group velocity and phase velocity(群速度与相速度)