mysql表的创建和修改

数据库表是数据库中最重要的部分。表的创建可以通过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 TIMESTAMPDROP 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;

你可能感兴趣的:(mysql学习记录,mysql,数据库)