——此文章摘自《MySQL 权威指南(第版)》定价元 特价元 购买>>
test_vote数据库创建好了但它现在还不能保存任何信息信息需要用数据表来保存如果想在test_vote数据库里创建一个新的数据表还需要再执行一条CREATE TABLE命令
在执行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命令创建出了一个新的数据表这数据表有idchoice和ts 个数据列如果把一些数据(网上问卷调查结果)填入这个数据表这个数据表的内容就将显示为如下所示的样子
这些数据的含义是第一个回答问卷问题的人选择的程序设计语言是PHP第二个人选择的是VB第三个人选择的又是PHP接下来的几个人分别选择了PerlOtherPerl和C那个名为id的数据列包含着一个递增的标识编号这使每行数据(它们被统称为数据集)都有一个独一无二的编号名为choice的数据列保存着人们在回答调查问卷时做出的选择(经过了编码)数字分别对应着CJavaPerlPHPVB等几种程序设计语言和Other(其他)名为ts的数据列记录着人们回答调查问卷的时刻(比如说第一个回答问卷问题的人是在年月日点分秒填写好votehtml页面的)
注解 与其他专业领域一样数据库领域也有自己的术语比如说数据库专业人员会把上面数据表里的每一行称为一条数据记录(data record)把它的每一列(例如id和choice列)称为一个字段(field)
如果只是为了生成一个由id和choice两个数据列构成的数据表下面这条命令就已经足够了
这条命令将把id列的数据类型声明为INT把choice列的数据类型声明为TINYINT这些声明意味着从理论上讲在超出整数变量id的表示范围之前最多可以有(即 )个人参与问卷调查(如果把id列声明为UNSIGNED INT类型这个数字将翻一番)再看choice列它可以提供种选择(本书将在第章对INTTINYINT以及其他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字段定义为主键)