表的进阶操作

一、存储引擎简介

  通常我们存储不同类型的文件,都会采用不同的格式文件来保存。

  所以,数据库中的数据也应该采取不同的存储格式来存储对应的文件,表的类型不同会对应MySQL不同的存储机制,表类型又称为存储引擎。

  在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

create table tb(id primary key auto_increment) engine=innodb;
python指定存储引擎的语法

二、表的简单操作

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 |
+-------+---------+------+-----+---------+----------------+
primary key
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 |
+-------+---------+------+-----+---------+----------------+
not null unique

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 表名;

 

posted @ 2018-07-23 10:33  Smart1san  阅读(186)  评论(0编辑  收藏  举报