一、存储引擎简介
通常我们存储不同类型的文件,都会采用不同的格式文件来保存。
所以,数据库中的数据也应该采取不同的存储格式来存储对应的文件,表的类型不同会对应MySQL不同的存储机制,表类型又称为存储引擎。
在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。
create table tb(id primary key auto_increment) engine=innodb;
二、表的简单操作
1. 创建表的完整语法和注意事项
语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件]);
注意事项:
1.同一张表中字段名是不允许重复的
2.中括号里边的条件不是必须指定的
3.字段名后边的类型是必须存在的
4.表中的最后一个字段是不能加逗号的
2. 查看表结构
desc 表名;
创建表的完整语法: mysql> create table t( -> id int primary key auto_increment, -> name varchar(15) not null, -> sex varchar(10) not null default 'male' -> ); 查看表的结构 mysql> desc t; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(15) | NO | | NULL | | | sex | varchar(10) | NO | | male | | +-------+-------------+------+-----+---------+----------------+
三、数据类型
https://www.cnblogs.com/Smart1san/p/9339846.html
四、表的完整约束性
1.关键词及作用
作用:保证数据的完整性和一致性
关键词:primary key 标识该字段为表的主键,可以唯一的标识记录
auto_increment 标识该字段的值自动增长,一般是主键,int类型
foreign key 标识该字段为该表的外键
not null 标识该字段的值不能为空
default 标识该字段的默认值
unique key 标识该字段的值是唯一的
unsigned 无符号
zerofill 用零填充
2.unique
not null unique 和 primary key 的效果是一致的
mysql> create table t1( -> id int primary key auto_increment); mysql> desc t1; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | +-------+---------+------+-----+---------+----------------+
mysql> create table t2( -> id int not null unique auto_increment); mysql> desc t2; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | +-------+---------+------+-----+---------+----------------+
3.primary key
单列主键
mysql> create table t1( -> id int not null unique, -> name varchar(15) not null unique -> ); mysql> desc t1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(15) | NO | UNI | NULL | | +-------+-------------+------+-----+---------+-------+
mysql> create table t2( -> id int primary key auto_increment, -> name varchar(15) not null unique -> ); mysql> desc t2; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(15) | NO | UNI | NULL | | +-------+-------------+------+-----+---------+----------------+
在所有的字段名后边单独i定义设置主键 mysql> create table t3( -> id int, -> name varchar(15) not null unique, -> constraint pk_name primary key(id) -> ); mysql> desc t3; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | name | varchar(15) | NO | UNI | NULL | | +-------+-------------+------+-----+---------+-------+
多列主键
mysql> create table t4( -> ip varchar(15), -> port char(5), -> primary key(ip,port) -> ); mysql> desc t4; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | ip | varchar(15) | NO | PRI | | | | port | char(5) | NO | PRI | | | +-------+-------------+------+-----+---------+-------+
4.auto_increment
约束字段为自动增长,被约束的字段必须同时被key约束
mysql> create table t( -> id int primary key auto_increment, -> name varchar(15) -> ); mysql> desc t; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(15) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ mysql> select * from t; +----+--------+ | id | name | +----+--------+ | 1 | baobao | | 2 | haohao | | 3 | laolao | +----+--------+
5.foreign key
两张表之间关系的查找
5.1先站在左表的角度去找
是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id)
5.2再站在右表的角度去找
是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段foreign key 左表一个字段(通常是id)
5.3总结:
#多对一:
如果只有步骤1成立,则是左表多对一右表
如果只有步骤2成立,则是右表多对一左表
#多对多
如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系
#一对一:
如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成unique即可
五、修改表的操作
1.修改表名
alter table 表名 rename 新表名
2.删除字段
alter table 表名 drop 字段名
3.增加字段
alter table 表名 add 字段 数据类型 [完整性约束条件];
alter table 表名 add 字段 数据类型 [完整性约束条件] first; # 将该字段移至表的第一列(最前方)
alter table 表名 add 字段1 数据类型 [完整性约束条件] after 字段2; #将字段1放至在字段2之后
4.修改字段
alter table 表名 modify 字段名 数据类型 [完整性约束条件];
alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件];
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件];
六、复制表
1.复制表结构+记录(该方法的 key 不会复制:即主键、外键和索引)
create table 新表名 select * from 旧表名;
2.只复制表结构
该方法的 key 也不会跟着一起复制
create table 新表名 select * from 旧表名 where 1>2; # 因条件不成立,故而在新的表中查不到任何的记录
该方法的 key 会跟着一起复制过去
create table 新表名 like 旧表名;
七、删除表
drop table 表名;