数据库表是数据库中最重要的部分。表的创建可以通过create table语句,表的修改可以通过alter table语句。
create table 表名(
字段 数据类型 字段约束或索引,
...,
表约束
)
首先当前用户需要拥有create权限,默认情况下表创建在默认数据库下,存储引擎是InnoDB。如果表已存在会执行失败,可以加上 create table if not exists 表名 。这样如果表已存在就不会再执行当前语句。表名部分还可以明确指定数据库名方式:[数据库名].[表名]。
一个表有多个列组成。一个表最大允许4096个列,这已经很大了,实际情况单表使用的列远小于该值。每一个列定义有列名、类型和必要的约束组成。
列名最好与业务相关有意义,尽量不要使用关键字。
列类型:列类型前面有篇文章介绍数据类型,常见有整数型、浮点数、日期和字符类型。可以根据实际数据进行定义。
对于字符串类型可以使用CHARACTER SET来指定当前列的字符集,如果没有明确指定则默认使用数据库的默认字符集。常见的字符集有utf8 和 utf8mb4。
CREATE TABLE users (
username VARCHAR(255) CHARACTER SET utf8mb4
);
非空约束
可以定义约束一个列非空,在表定义时候使用not null。一般在索引列上尽量避免空值。
create table test( uname varchar(1) NOT null );
在设置非空约束的列如果插值为null,则语句会执行失败。
默认值
在一个列如果插入数据没有指定值是,可以使用default关键字设置当前列的默认值。
create table test( gender char(1) default '0' );
自增(AUTO_INCREMENT)
一般在整数类型列上,可以设置AUTO_INCREMENT属性约束当前列值自增。在数据插入时候,不必显示进行设置该列的值,mysql会自动计算上次值+1。和序列功能类似。如果AUTO_INCREMENT列达到了当前类型最大值,则又会从1循环开始。
每一个表只能有一个AUTO_INCREMENT类型的列,列上必须要有索引。一般使用在自增主键上。
create table test( id int PRIMARY KEY AUTO_INCREMENT );
设置备注(COMMENT)
每个列可以通过COMMENT设置备注信息,特别是一些状态标识位的列,可以在备注上设置具体的每个状态值代表的意义。
create table test( gender char(1) default '0' COMMENT '0-男;1-女' );
一个表可以创建不同类型的索引,用来提高数据检索效率,一个索引可以创建在一列数据,同时也可以创建在多列上。索引类型有注解索引、唯一索引、普通索引等。
索引在create table语句索引列定义完成后的最后部分:索引类型 索引名称(涉及列列表) 这样。
主键索引(PRIMARY KEY)
主键用来唯一标识一行数据,一个表只允许有一个主键索引,主键类型的索引默认是非空类型的,并且列值在表中唯一。
唯一索引(UNIQUE INDEX)
唯一索引约束当前索引修饰的列不准有重复数据,如果尝试在索引列上插入一个已经存在的值会发生错误。虽然唯一索引要求整个表数据对应列值不能重复,但是null是一个特殊值,是允许多个null值存在的。这也是和主键一个区别。
CREATE TABLE test (ucode VARCHAR(20) ,UNIQUE INDEX (ucode));
普通索引 (INDEX)
很多时候创建索引不是为了约束数据的唯一性,只是为了提高查询效率。这个时候创建一个普通的索引即可。
CREATE TABLE users (
uid INT(11) NOT NULL AUTO_INCREMENT,
ucode VARCHAR(20) ,
uname VARCHAR(50) ,
PRIMARY KEY (uid) ,
UNIQUE INDEX ucode (ucode),
INDEX ucode_uname (ucode, uname)
)
索引是数据库中一个很重要的部分,一些查询的优化很多都是借助索引来完成。这里只说索引的语法,后面应该会学习索引的原理。
除了在建表语句中设定索引外,还可通过单独的语句给表创建索引。
语法如下:
CREATE [UNIQUE] INDEX 索引名称 ON 表名 (列,...)
这里看到单独创建索引是无法创建主键索引的,需要借助下面的表修改语句。
表在创建好后,在后期使用中随着业务的变更,可能不能满足业务需求,通常需要对表进行扩展或修改。若新增字段、修改字段长度,添加新的索引等。这个时候需要用到表修改(alter table)。
整体语法
alter table 表名 [alter_option [, alter_option] ...]
一次可以执行多个修改操作,用英文逗号相隔。
假设有以下测试表
CREATE TABLE t1 (a INTEGER, b CHAR(10));
修改表名
ALTER TABLE t1 RENAME t2;
修改字段类型
ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
modify和change都可以修改字段定义。modify只能修改列定义不能修改列名称,change可以同时更改列名和数据类型。另外修改列名也可以直接通过RENAME COLUMN b TO a;来完成。
修改字段类型要主要,特别修改后容量小于修改前容量时候,数据库会对超过部分数据进行截取,这肯能导致数据的变化。列的修改包括该名如果该列上有索引,数据库会自动更新索引。
添加删除列
ALTER TABLE t2 ADD d TIMESTAMP,DROP COLUMN c;
添加索引
ALTER TABLE t2 ADD INDEX (d), ADD UNIQUE (a);
添加自增主键
ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (c);
修改自增列当前值
ALTER TABLE t1 AUTO_INCREMENT = 13;
修改表字符集
ALTER TABLE t1 CHARACTER SET = utf8mb4;
修改或添加表备注
ALTER TABLE t1 COMMENT = 'New table comment';
有时候需要复制一份表数据或结果,特别是在表备份时候。可以用以下两种方式
1、create table … like
CREATE TABLE new_tbl LIKE orig_tbl;
这种方式创建的表只有表结构没有数据。
2、CREATE TABLE … SELECT Statement
CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;
创建新表并将现有表的数据插入。默认情况下新表列所有信息继承自原表。当然也可以在新表语句出明确指定类型。
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;