在执行CREATE TABLE命令的时候,必须告诉它想让它在哪个数据库里创建新的数据表,这项工作要用USE命令来完成。USE命令的用途是为后续命令指定一个默认数据库,让它们知道应该对哪个数据库进行处理或操作。(要知道,除了刚刚创建的test_vote数据库,MySQL服务器很可能还管理着许多其他的数据库。)
从未接触过数据库系统的读者可能会对CREATE TABLE命令感到有些陌生。别管它,先把上面给出的黑体字命令输入进去。(可以用回车键来断开那些命令行,在最后一行用分号结束整个命令。分号的作用是告诉mysql程序“整个命令已输入完毕”。)
如果在输入命令的时候打错了字,MySQL会立刻发现它并用一条出错消息通知用户。如果真的遇到这种情况,将需要重新输入整个命令。使用上、下箭头键可以迅速到达出错位置去做出修改。
如果打错了字但MySQL还是接受了输入的CREATE TABLE命令(出现这种情况的原因是,虽然打错了字或者说犯了一个语义错误,但它在语法上仍是正确的),使用DROP TABLE votelanguage命令删除定义有误的数据表,然后重新输入正确的CREATE TABLE命令。
用CREATE TABLE命令来创建votelanguage数据表只是办法之一,完全可以使用其他的数据库管理工具,如MySQL Administrator或phpMyAdmin,来完成这项工作。当然,那么做的先决条件是已经把那些工具安装在了计算机里,并且知道它们的使用方法。mysql程序的易用性比较差是人所共知的事实,但它的好处是可以把曾经执行过的步骤详细地记录下来,让用户有机会改正错误。
现在来解释一下实际发生了哪些事情。刚才输入和执行的CREATE TABLE命令创建出了一个新的数据表,这数据表有id、choice和ts 3个数据列。如果把一些数据(网上问卷调查结果)填入这个数据表,这个数据表的内容就将显示为如下所示的样子:
这些数据的含义是:第一个回答问卷问题的人选择的程序设计语言是PHP,第二个人选择的是VB,第三个人选择的又是PHP。接下来的几个人分别选择了Perl、Other、Perl和C。那个名为id的数据列包含着一个递增的标识编号,这使每行数据(它们被统称为“数据集”)都有一个独一无二的编号。名为choice的数据列保存着人们在回答调查问卷时做出的选择(经过了编码),数字1-6分别对应着C、Java、Perl、PHP、VB等几种程序设计语言和Other(“其他”)。名为ts的数据列记录着人们回答调查问卷的时刻(比如说,第一个回答问卷问题的人是在2005年1月14日15点46分18秒填写好vote.html页面的)。
注解 与其他专业领域一样,数据库领域也有自己的术语。比如说,数据库专业人员会把上面数据表里的每一行称为一条数据记录(data record),把它的每一列(例如id和choice列)称为一个字段(field)。
如果只是为了生成一个由id和choice两个数据列构成的数据表,下面这条命令就已经足够了:
这条命令将把id列的数据类型声明为INT,把choice列的数据类型声明为TINYINT。这些声明意味着,从理论上讲,在超出整数变量id的表示范围之前,最多可以有231(即2 147 483 648)个人参与问卷调查(如果把id列声明为UNSIGNED INT类型,这个数字将翻一番)。再看choice列,它可以提供216种选择。(本书将在第8章对INT、TINYINT以及其他MySQL数据类型进行讨论。)
看到这儿,或许会有一些读者对本章的内容安排提出质疑:既然有这么简单的办法可以得到同样的结果,为什么不先介绍它而是让大家使用那么复杂的CREATE TABLE命令呢?是这样的,这种复杂与简单之间的区别正是好的和坏的数据库设计方案之间的区别。
在前一个CREATE TABLE命令里,为id数据列定义了AUTO_INCREMENT属性。这么做的效果是MySQL会在每一条新记录里自动插入一个正确的id值。这样一来,在保存问卷调查结果的时候,只要处理好choice字段即可,id字段有MySQL替我们照料。这个属性将确保数据记录的编号是递增的和独一无二的,而这一点对数据表的使用和管理工作有着非常重要的意义。
在前一个CREATE TABLE命令里,还为id和choice数据列定义了NOT NULL属性。这个属性的作用是确保id和choice这两个字段的取值有实际意义。具体到这个案例,首先,空数据记录(NULL)将不允许存入数据表;其次,choice字段没有取值的数据记录也不允许存入数据表(id字段由MySQL负责处理,它肯定会有取值)。总之,这个属性可以防止非法或无效的数据记录被存入数据表。(读者不妨试试看能不能让MySQL接受一个非法的数据记录,它肯定会拒绝接受并显示一条出错信息。)
PRIMARY KEY属性(见id数据列)的效果是让MySQL使用id数据列来标识各条数据记录。这其实是最先定义id数据列的原因,但因为MySQL还没有聪明到可以猜出人类思想的地步,所以还需要通过PRIMARY KEY属性把我们想让它做的事情精确无误地告诉它。(从现在起,将在讨论这个案例的时候把id字段改称为主键(primary key)。)一个数据表是否有主键对MySQL访问这个数据表里的数据记录的速度有着决定性的影响,对那些相互关联的数据表来说就更是如此。作为一个原则,应该为自己的每一个数据表定义一个唯一的主键(在这样做的时候,要尽可能地把含有AUTO_INCREMENT属性的INT字段定义为主键)。