在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个字段。
在创建完数据库后,接下来的工作就是创建数据表。所谓创建数据表,指的是在已经创建好的数据库中建立新表。创建数据表的过程就是定义数据列(又称为字段)的过程,同时也是定义数据完整性约束的过程。关于约束请看第8章。
创建数据表的语句为CREATE TABLE,语法格式如下。
在使用CREATE TABLE创建表时,必须指定如下信息。
· 如果要创建表的名称,那么在同一个数据库中不能创建同名的表,否则会报“Table'表名'already exists”的错误。
· 数据库中每个字段都要指定名称和数据类型(关于数据类型请看第5章),如果创建多个字段(多列),多个字段之间就要用逗号隔开。
· 表名、字段名遵循SQL命名规范,不区分大小写,不能使用SQL语言中的关键字,请使用合法字符并且尽量见名知意。
· 关于字段的其他属性请看后续章节。
例如,创建学生表“tb_student”,其表结构如表3-1所示。
表3-1 学生表tb_student结构
SQL语句示例如下。
(1)选择创建表的数据库“atguigu_chapter3”。
(2)创建“tb_student”表。
说明,“INT”表示整数类型,“VARCHAR(20)”表示长度不超过20个字符的字符串文本。另外,在创建数据表之前,必须使用USE语句指定操作是在哪个数据库中进行的,如果没有指明数据库,就会报“No database selected”的错误。如果不想使用USE语句,就必须在创建数据表时在表名前面加“数据库名.”进行限定。
(3)在“atguigu_chapter3”数据库下创建“tb_teacher”表。
如果接下来SQL都是针对一个数据库进行操作的话,还是建议使用USE语句,否则每个SQL语句中的数据库对象(例如,表)前面都要加“数据库名.”,这样太麻烦了。
在创建完数据库表后,可以使用SHOW语句查看当前数据库中的表。SHOW语句语法格式如下。
例如,查看“atguigu_chapter3”数据库的所有表,SQL语句示例如下。
同样,在SHOW TABLES语句之前应该使用USE语句指定操作是在哪个数据库中进行的,否则会报“No database selected”的错误。如果没有使用USE语句,也可以通过如下SQL语句查看某个数据库的所有表,语法格式如下。
例如,查看“atguigu_chapter3”数据库的所有表,SQL语句示例如下。
使用SQL语句创建好数据表后,可以查看表结构的定义,以确认表的定义是否正确。在MySQL中,查看表结构可以使用DESCRIBE和SHOW CREATE TABLE语句。
DESCRIBE语句可以查看表的字段信息,其中包括字段名、字段数据类型,以及其他属性信息,这些信息相当于数据表的元数据。DESCRIBE语句的语法格式如下。
或者简写成:
例如,查看“tb_student”表的结构,SQL语句示例如下。
其中,各个字段的含义分别解释如下。
· Field:字段名。
· Type:字段数据类型。
· Null:表示该列是否可以存储Null值。
· Key:表示该列是否定义索引。如果有的话,通常会有PRI、UNI、MUL等几种情况索引。
· Default:表示该列是否有默认值,有的话默认值是多少。
· Extra:表示可以获取的与给定列有关的附加信息。例如,AUTO_INCREMENT等。
· 关于Null、Key、Default、Extra请看第8章约束相关内容。
另外,也可以使用SHOW语句查看某个数据库表更详细的定义,语法格式如下。
例如,查看“tb_student”表的定义,SQL语句示例如下。
从上面数据库表的定义信息中发现,数据库表定义不只是字段,还有字符集、字符集校对规则和存储引擎(例如,InnoDB)等信息。关于数据库存储引擎的详细内容,请关注本书的姊妹篇《剑指MySQL——架构、调优与运维》。
在创建完表后,表结构就确定了。一般来说,在创建数据表时就应该充分考虑以后的需求变动,合理设置字段和索引(关于索引请关注本书的姊妹篇《剑指MySQL——架构、调优与运维》),最好不要修改已有数据表的结构,特别是生产环境(项目已上线使用)下的表结构,因为一旦修改,影响就很大。如果是在测试环境(项目在开发阶段)下,可以通过ALTER语句修改表结构。ALTER语句可以实现修改表名称、增加字段、删除字段、修改字段名称,以及数据类型和顺序等属性。
1.增加字段
互联网应用总会面对频繁添加功能或修改需求的情况,而增加字段则是最常见的解决方法之一。用ALTER语句对已有数据表增加字段的语法格式如下。
例如,给“tb_student”表增加新的字段“score”,其数据类型为“INT”,SQL语句示例如下。
增加字段之后再次查看“tb_student”表结构如下。
在增加字段时,默认在所有字段末尾增加新字段,可以通过AFTER和FIRST关键字指定新字段的位置,分别是在某个字段后面或在第一个字段后面。
例如,给“tb_student”表增加新的字段“age”,数据类型为“INT”,并且指定“age”在“sname”字段后面。增加字段后重新查询“tb_student”表的结构,SQL语句示例如下。
2.删除字段
如果确定表中某个字段(某一列)的数据确实不要了,也可以使用ALTER语句删除字段(列)。字段删除后,该字段(列)的数据也会被彻底删除,所以关于删除操作一定要慎之又慎。删除字段的语法格式如下。
例如,删除“tb_student”表的“age”字段,SQL语句示例如下。
3.修改字段名、数据类型、位置等
修改字段名称可以通过CHANGE关键字实现,而修改字段数据类型、位置等属性则需要通过MODIFY关键字实现。
修改字段名的语法格式如下。
例如,修改“tb_student”表的“score”字段名为“chinese”,SQL语句示例如下。
如果表中已经有数据了,那么修改字段的数据类型是非常危险的操作,因为这涉及新的数据类型是否能兼容原来的数据问题。如果确定没有问题的话,那么也可以使用ALTER语句进行修改。修改字段数据类型、位置等属性的语法格式如下。
例如,修改“tb_student”表的“sname”字段数据类型为“VARCHAR(30)”,SQL语句示例如下。
4.修改表名称
表名称的修改是最不常见的操作。但是如果确实需要的话,可以使用如下语句进行修改,语法格式如下。
SQL语句示例如下。
(1)修改“tb_student”表为“student”表。
(2)修改“student”表为“tb_student”表。
5.修改数据表的编码方式等
ALTER语句同样可以用来修改表的编码方式等,语法格式如下。
例如,修改“tb_student”表的字符集为“utf8”,校对规则修改为“utf8_general_ci”,SQL语句示例如下。
从上面的结果中发现,修改表结构的字符集和校对规则成功(utf8是utf8mb3的别名),但是“sname”字段的字符集和校对规则仍然是原来的。同样可以使用ALTER语句来修改字段的字符集和校对规则。
如果表中已经有数据了,那么关于表或字段的字符集和校对规则的修改就要考虑已有数据是否兼容的问题。
删除数据表不仅会清空表中的所有记录,也会将表结构一并删除。凡是删除操作,都要反复讨论和确认过之后再进行,就算先进行备份后删除也不过分。删除数据表的语句格式如下。
例如,删除“tb_teacher”表,SQL语句示例如下。