3.3.2 创建表

创建数据库是比较容易的部分, 但是现在它是空的, 正如 SHOW TABLES 告诉你的:

  1. mysql> SHOW TABLES;
  2. Empty set (0.00 sec)

困难的部分是决定数据库的结构应该是什么: 需要那些表以及每个表应该包含那些列.

你需要一个包含你的每个宠物信息的表. 可以成为 pet 表, 它至少应该包含每个动物的名称. 因为名字本身并不是很有趣, 表中应该包含其它信息. 例如, 如果你家里不止一个人养宠物, 你可能想列出每只动物的主人. 你可能也想记录一些基本的描述信息, 比如物种和性别.

年龄呢? 这可能很有趣, 但是将其存储在数据库中并不是一件好事. 年龄随着时间的推移而变化, 这意味着你必须经常更新你的记录. 相反, 最好存储一个固定的值比如出生日期. 然后, 当你需要年龄的时候, 你可以把它计算成当前日期和出生日期之间的差值. MySQL 提供了执行日期计算的函数, 所有这并不困难. 保存出生日期而不是年龄还有其它好处:

  • 你可以使用该数据库执行任务, 比如为即将到来的宠物生日生成提醒. (If you think this type of query is somewhat silly, note that it is the same question you might ask in the context of a business database to identify clients to whom you need to send out birthday greetings in the current week or month, for that computer-assisted personal touch.)

  • 你可以计算年龄与日期的关系, 而不是与当前日期的关系. 例如, 如果你将死亡日期存储到数据库中, 你可以轻松的计算出宠物死亡时的年龄.

你可能会想到在 pet 表中有用的其它类型的信息, 但是到目前为止所识别的信息已经足够了: 名称(name), 所有者(owner), 物种(species), 性别(sex), 出生(birth), 和死亡(death).

使用 CREATE TABLE 语句指定表格的布局:

  1. mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
  2. species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

VARCHAR 对于 name, owner, 和 species 列, 是一个很好的选择, 因为列值的长度各不相同. 这些列定义的长度不一定都相同, 也不一定是 20. 你通常可以选择 165535 之间的任意长度, 只要你觉得最合理. 如果你做了一个糟糕的选择, 后来发现你需要一个更长的字段, MySQL 提供了一个 ALTER TABLE 语句.

可以选择几种类型的值来表示动物记录中的性别, 比如 'm''f', 或者 'male' and 'female'. 使用单个字符 'm''f' 是最简单的.

对于 birth 和 death 列使用 DATE 数据类型是一个非常显而易见的选择.

一旦你创建了表, SHOW TABLES 应该会产生一些输出:

  1. mysql> SHOW TABLES;
  2. +---------------------+
  3. | Tables in menagerie |
  4. +---------------------+
  5. | pet |
  6. +---------------------+

要验证你的表是按照你期望的方式创建的, 使用 DESCRIBE 语句:

  1. mysql> DESCRIBE pet;
  2. +---------+-------------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +---------+-------------+------+-----+---------+-------+
  5. | name | varchar(20) | YES | | NULL | |
  6. | owner | varchar(20) | YES | | NULL | |
  7. | species | varchar(20) | YES | | NULL | |
  8. | sex | char(1) | YES | | NULL | |
  9. | birth | date | YES | | NULL | |
  10. | death | date | YES | | NULL | |
  11. +---------+-------------+------+-----+---------+-------+

你可以随时使用 DESCRIBE, 例如, 如果忘记了表中列的名称或者它们的类型.

有关 MySQL 数据类型的更多信息, 参阅 Chapter 11, 数据类型.