类型 | 类型举例 |
---|---|
整数类型 | TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT |
浮点类型 | FLOAT、DOUBLE |
定点数类型 | DECIMAL |
位类型 | BIT |
日期时间类型 | YEAR、TIME、DATE、DATETIME、TIMESTAMP |
文本字符串类型 | CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT |
枚举类型 | ENUM |
集合类型 | SET |
二进制字符串类型 | BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB |
JSON类型 | JSON对象、JSON数组 |
空间数据类型 | 单值:GEOMETRY、POINT、LINESTRING、POLYGON 集合:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、 GEOMETRYCOLLECTION |
常用的几类类型介绍如下:
数据类型 | 描述 |
---|---|
INT | 从 − 2 31 -2^{31} −231到 2 31 − 1 2^{31}-1 231−1的整型数据。存储大小为4个字节 |
CHAR(size) | 定长字符数据。若未指定,默认为1个字符,最大长度255 |
VARCHAR(size) | 可变长字符数据,根据字符串实际长度保存,必须指定长度 |
FLOAT(M,D) | 单精度,占用4个字节,M=整数位+小数位,D=小数位。D<=M<=255, 0<=D<=30,默认M+D<=6 |
DOUBLE(M,D) | 双精度,占用8个字节,D<=M<=255, 0<=D<=30,默认M+D<=15 |
DECIMAL(M,D) | 高精度小数,占用M+2个字节,D<=M<=65,0<=D<=30,最大取值范围与DOUBLE相同 |
DATE | 日期型数据,格式YYYY-MM-DD |
BLOB | 二进制形式的长文本数据,最大可达4G |
TEXT | 长文本数据,最大可达4G |
创建数据库
mysql> create database if not exists test character set utf8mb4;
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql>
database不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的
查看当前正在使用的数据库
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)
mysql>
更改数据库字符集
mysql> alter database test character set utf8mb4;
Query OK, 1 row affected (0.03 sec)
mysql>
创建方式一语法
CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
......
[表约束条件]
);
创建表时,int类型会被设置为int(11),这里的11是int类型的显示宽度
创建方式二语法:
CREATE TABLE 表名
[(column, column, ......)]
As subquery;
示例如下:
mysql> create table tb2 (
-> id int not null default 0,
-> name varchar(64)
-> ) select id, name from tb1;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql>
mysql> desc tb2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | NO | | 0 | |
| name | varchar(64) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql>
向已有的表中添加列
语法:
ALTER TABLE 表名 ADD [COLUMN] 字段名 字段类型 [FIRST|AFTER 字段名];
修改现有表中的列
可以修改列的数据类型,长度、默认值和位置,语法如下:
ALTER TABLE 表名 MODIFY [COLUMN] 字段名 字段类型 [DEFAULT 默认值] [FIRST|AFTER 字段名];
对默认值的修改只影响后面插入的行数据
删除现有表中的列
语法:
ALTER TABLE 表名 DROP [COLUMN] 字段名
重命名现有表中的列
语法:
ALTER TABLE 表名 CHANGE [column] 列名 新列名 新数据类型;
方式一:
RENAME TABLE 表名 TO 表名;
方式二:
ALTER TABLE 表名 RENAME [TO] 表名;
删除表结果和数据语法:
DROP TABLE [IF EXISTS] 数据表1[, 数据表2, …..., 数据表n];
清空表数据使用truncate,truncate不支持事务且不能触发trigger
InnoDB表的DDL支持事务完整性,即DDL操作要么成功要么回滚 。DDL操作回滚日志写入到data dictionary数据字典表mysql.innodb_ddl_log(该表是隐藏的表,通过show tables无法看到)中,用于回滚操作
如下所示:
mysql> drop table tb2, tb3;
ERROR 1051 (42S02): Unknown table 'test.tb3'
mysql>
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tb1 |
| tb2 |
+----------------+
2 rows in set (0.01 sec)
mysql>
tb2表被回滚,并没有删除