9.8.2 理解列的类型
我们首先看看第一个表的例子:
create table customers
(customerid int unsigned not null auto_increment primary key,
name char(50)not null,
address char(100)not null,
city char(30)not null
);
在创建一个表的时候,需要确定列的数据类型。
对于customers表,我们在模式里指定它有4个列。第一列customerid,是主键,我们已经直接将它指定为主键。确定该列的数据类型是一个整数(数据类型int),而且这些ID应该是无符号的(unsigned)。我们还使用了auto_increment工具,这样MySQL就可以为我们管理这些,我们就不需要担心它。
其他列都是字符串类型数据。我们为这些列选择了char类型。同时,还将它们定义为固定长度的字段,该长度是在括号里指定的,例如姓名最多可以有50个字符宽度。
该数据类型将为姓名分配50个字符的存储空间,尽管姓名的长度通常不会长达30个字符。MySQL将用空格填充空余的部分。或者,我们还可以选择使用varchar类型,该数据类型可以根据需要分配存储空间(加一个字节)。这可能会有一些不足——因为,虽然varchar类型数据占用空间较小,但是char类型数据速度更快。
请注意,我们所声明的所有列都是NOT NULL(不为空),这是一个小小的优化措施,可以使得那些需要的地方速度更快。我们将在第12章中详细介绍优化。
其他一些CREATE语句在语法上有些不同。让我们来看看orders表:
create table orders
(orderid int unsigned not null auto_increment primary key,
customerid int unsigned not null,
amount float(6,2),
date date not null
);
amount列被指定为浮点类型数据(float)。对于大多数据浮点数据类型来说,可以指定显示宽度和小数点后的位数。在这个例子中,订单总量将以美元计算,因此我们将允许合理大小的订单总金额(宽6位),小数位数到美分(2位)。
Date(日期)列数据类型为date。
在这个表中,我们将所有列指定为NOT NULL,这是为什么呢?因为当一个订单输入数据库的时候,将在orders表中创建一个记录,将所购物品添加到order_items表中,然后计算出总金额。在创建订单之前,我们可能还无法知道订单的总金额,所以必须允许amount列为NULL。
books表具有一些类似的特性:
create table books
(isbn char(13)not null primary key,
author char(50),
title char(100),
price float(4,2)
);
在这个例子中,我们不必生成主键,因为可以将ISBN作为主键,而ISBN在其他地方可以生成。我们将其他字段设置为NULL,因为书店可能在知道书本标题(title)、作者(author)或价格(price)之前就已经知道此书的ISBN了。
order_items表显示了如何创建多列主键:
create table order_items
(orderid int unsigned not null,
isbn char(13)not null,
quantity tinyint unsigned,
primary key(orderid,isbn)
);
该表将图书的数量指定为TINYINT UNSIGNED数据类型,其取值范围为0~255之间的一个整数。
正如前面已经提到的,多列主键需要通过一个特定的主键子句指定。在这里,我们就要使用它。
最后,考虑book_reviews表:
create table book_reviews
(
isbn char(13)not null primary key,
review text
);
它使用了本书尚未讨论过的新数据类型,text。该数据类型用于更长的文本,例如一篇文章。基于这个数据类型,还有一些变量,我们将在本章后续内容中详细讨论。
要更详细地理解创建表,我们应该先简单地介绍一下列名称和标识符,然后再介绍可以为列指定的数据类型。但是首先,让我们先了解已经创建的数据库。