创建数据库的下一步是创建实际的表。可以使用SQL命令CREATE TABLE来完成它。CREATE TABLE语句的常见形式如下所示:
CREATE TABLE tablename(columns)
提示 你可能会注意到,MySQL提供了多个表类型和存储引擎,其中包括一些事务安全的类型。
我们将在第13章介绍这些表类型。目前,books数据库中所有表都使用了默认存储引擎,MyISAM。
应该用要创建的表名代替tablename占位符,用逗号分开的列名称列表代替columns占位符。每一列应该有一个名字,该名字后面紧跟其数据类型。
这里再次给出了Book-O-Rama的模式:
Customers(CustomerID,Name,Address,City)
Orders(OrderID,CustomerID,Amount,Date)
Books(ISBN,Author,Title,Price)
Order_Items(OrderID,ISBN,Quantity)
Book_Reviews(ISBN,Reviews)
程序清单9-1显示了如何使用SQL来创建这些表。可以在文件中找到这个SQL脚本,该脚本保存于文件chapter9/bookorama.sql中。
可以运行现有的SQL文件,例如,从文件中载入的一个文件,输入以下语句:
>mysql-h host-u bookorama-D books-p<bookorama.sql
(请记住,用你的主机名称替换host并且指定bookorama.sql文件的完整路径)
在这里,使用文件重定向是相当方便的,因为它意味着在执行之前,可以在所选择的文本编辑器中编辑SQL。
程序清单9-1 bookorama.sql——创建Book-O-Rama数据库表的SQL脚本
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
);
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
);
create table books
(isbn char(13)not null primary key,
author char(50),
title char(100),
price float(4,2)
);
create table order_items
(orderid int unsigned not null,
isbn char(13)not null,
quantity tinyint unsigned,
primary key(orderid,isbn)
);
create table book_reviews
(
isbn char(13)not null primary key,
review text
);
每个表由一个独立的CREATE TABLE语句所创建。可以看到我们已经创建了模式中的每个表,以及我们在上一章中为每个表所设计的列。每一列的名字后面都有一个数据类型。一些列还有其他特别项。
9.8.1 理解其他关键字的意思
NOT NULL的意思是表中所有行的此属性必须有一个值。如果没有指定,该列可以为空(NULL)。
AUTO_INCREMENT是一个特殊的MySQL特性,可以在整数列中使用它。它的意思是在表中插入行的时候,如果将该字段设置为空,那么MySQL将自动产生一个唯一的标识符值。该值比本列中现存的最大值更大。在每个表中只能有一个这样的值。指定AUTO_INCREMENT的列必须是索引列。
列名称后面的PRIMARY KEY表示该列是表的主键。本列中的输入必须唯一。MySQL将自动索引该列。在程序清单9-1的customers表中使用customerid时,我们将customerid列指定为AUTO_INCREMENT。主键的自动索引功能将管理AUTO_INCREMENT所要求的索引列。
在列的名称后面指定PRIMARY KEY,这只用于单列主键。Order_items语句结尾的分句PRIMARY KEY是一个可选格式,在这里,我们用到它是因为这个表的主键由两列组成(也将根据两列来创建索引)。
整数类型后面的UNSIGNED意思是它只能是0或者一个正数。