数据库表操作

存储引擎

引擎: 存储数据的方式,不同的存储方式会影响存取效率

常用存储引擎: Innodb  myisam  memory  blackhole

Innodb: 支持事务,行级锁,外键

myisam: 支持表级锁

memory: 内存级别的存储引擎,相当于缓存的作用,存取速度快,不能完成数据的持久化存储,重启mysql之后,表中的数据就会消失,适用于断电即消失的数据,或者存储一些效率要求比较高的,丢失不要紧的数据

  一般会把所有的视频都以Innodb存储引擎的方式存在硬盘里,然后把经常被点击的热数据放到memory存储引擎中再存一次,存储到内存中,方便经常查看.

blackhole: 黑洞,读写分离,所有数据都可以写入,但是都不会真的记录在表当中,主从多级复制

事务: n句sql是一个完整的事件,这n句sql要么一起成功,要么一起失败

行级锁: 能够支持更多的修改数据的并发操作,当修改的行数非常多的时候,效率也会受到影响

表级锁: 不能支持并发的修改同一张表中的数据,不需要加很多细粒度的锁来浪费时间

外键: 在本表中有一个字段关联外表中的另一个字段

创建表

use 库名     #首先切换到数据库内  
create table 表名 (字段名 数据类型(宽度) 约束条件);   # 创建表
    create table t1 (id int,name char(10));

注意:

1.在同一张表中,字段名不能相同

2.宽度和约束条件可选择不写

3.字段名和类型必须写

查看表结构

desc/describe 表名;            #查看表的基础信息
show create table 表名 \G;     #查看表的详细信息(编码和存储引擎)

基础数据类型

数字

整数  int(宽度) 对整数约束宽度其实并没有实际的效果,比如设置宽度为5,约束只是在不足长度的时候的显示宽度是5,而不是你只能存储5位数

小数  float(n,m) n表示数据总长度,m表示小数位

时间类型

year 

date

time

datetime

timestamp     #不允许为空,默认值是当前时间 now(),能够表示的时间范围比较小(1970--2038),超出这个时间范围则表示为0000--00-00 00:00:00,如果同一个表中有两个该字段,只有第一个字段会被表示为默认当前时间

字符串

char(宽度)          定长  存储相对浪费空间(不足产股的时候会自动补齐长度进行存储),不管存储什么样的数据,在显示的时候都会把数据的空格去掉

varchar(宽度)     变长    相对节省空间,存取效率相对慢

应用:

char        手机号  身份证号   有限的长度

varchar    评论  备注      

enum和set

enum   枚举  单选  不能选择不在枚举范围内的. 在严格模式下,如果写入不在枚举范围内的内容会报错

set       集合  多选   去重   当重复选择集合当中的选项时,只会显示一个   不能选择不在集合范围内的内容

#创建一个表t1
mysql> create table t1 (id int,name char(10),gender enum('male','female'));
Query OK, 0 rows affected (1.87 sec)

#向表内添加数据,当性别不在指定枚举范围内,报错
mysql> insert into t1 values (1,'alex','unknown');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1

#写入枚举范围内的选项,并查看写入之后的表
mysql> insert into t1 values (1,'alex','male');
Query OK, 1 row affected (0.39 sec)

mysql> select * from t1;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | alex | male   |
+------+------+--------+
1 row in set (0.00 sec)

表的完整性约束

not null   非空

unique    唯一      

primary key    主键       =非空+唯一      一张表只能有一个或一组主键

default    默认值

#创建表t2,id为主键,年龄默认值为20
mysql> create table t2 (id int primary key,name char(10) not null,age int default 20);
Query OK, 0 rows affected (1.61 sec)

# 指定要输入的字段,让年龄使用默认值
mysql> insert into t2 (id,name) values (1,'taibai');
Query OK, 1 row affected (0.10 sec)

#查看表中的内容
mysql> select * from t2;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | taibai |   20 |
+----+--------+------+
1 row in set (0.00 sec)

#更改默认值并查看内容
mysql> insert into t2 values (2,'taibai',25);
Query OK, 1 row affected (0.36 sec)

mysql> select * from t2;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | taibai |   20 |
|  2 | taibai |   25 |
+----+--------+------+
2 rows in set (0.00 sec)
示例

unique(字段1,字段2)     联合唯一

mysql> create table t3 (id int,name char(10) not null,phone char(11),unique(id,phone));
Query OK, 0 rows affected (1.99 sec)
联合唯一

foreign key     外键

on update cascade    级连更新

on delete cascade     级连删除

# 创建记录班级信息的表t4,写入数据
mysql> create table t4_class (id int primary key,name char(10));
Query OK, 0 rows affected (1.78 sec)

mysql> insert into t4_class values (1,'python'),(2,'java');
Query OK, 2 rows affected (0.35 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t4_class;
+----+--------+
| id | name   |
+----+--------+
|  1 | python |
|  2 | java   |
+----+--------+
2 rows in set (0.00 sec)

# 创建记录学生信息的表t5,指定外键,与t4中的id字段相关联
mysql> create table t5_student (id int primary key,name char(10) not null,cls_id int,foreign key(cls_id) references t4_class(id) on delete cascade on update cascade);
Query OK, 0 rows affected (0.26 sec)

mysql> insert into t5_student values (1,'alex',1);
Query OK, 1 row affected (0.11 sec)

mysql> select * from t5_student;
+----+------+--------+
| id | name | cls_id |
+----+------+--------+
|  1 | alex |      1 |
+----+------+--------+
1 row in set (0.00 sec)
外键

auto_increment    自动增长   被约束的字段必须是int类型且唯一

# 创建表t6,id为主键且设置为自动增长
mysql> create table t6 (id int primary key auto_increment,name char(10),age int);
Query OK, 0 rows affected (3.06 sec)

mysql> insert into t6 (name,age) values ('alex',20),('wusir',21),('taibai',22);
Query OK, 3 rows affected (0.11 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t6;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | alex   |   20 |
|  2 | wusir  |   21 |
|  3 | taibai |   22 |
+----+--------+------+
3 rows in set (0.00 sec)
auto_crement

修改表结构

修改表名
alter table 表名 rename 新表名;

增加字段
alter table 表名 add 字段名 数据类型  约束条件,add 字段名 数据类型  约束条件;
                            
删除字段
alter table 表名 drop 字段名;

修改字段
alter table 表名 modify  字段名 数据类型  约束条件;     #修改数据类型和约束
alter table 表名 change 旧字段名 新字段名 数据类型 约束条件;

修改字段排列顺序/在增加的时候指定字段位置
alter table 表名 add 字段名 数据类型  约束条件  first;
alter table 表名 add 字段名 数据类型  约束条件  after 字段名;
alter table 表名 change 字段名 旧字段名 新字段名 新数据类型 约束条件 first;
alter table 表名 modify 字段名 数据类型 约束条件  after 字段名;

表与表之间的关系

一对一: b表中有一个字段是 unique且是a表中某一个字段的Foreign key

站在A表的角度上看一条数据是不是和b表中的一条数据关联

站在B表的角度上看一条数据是不是和a表中的一条数据关联

一对多: Foreign key

站在A表的角度上看一条数据是不是和b表中的一条数据关联

站在B表的角度上看一条数据是不是和A表中的多条数据关联

多对多: 建立c表,有一个字段是a表的Foreign key,还有一个字段是b表的Foreign key

站在A表的角度上看一条数据是不是和b表中的多条数据关联

站在B表的角度上看一条数据是不是和A表中的多条数据关联

猜你喜欢

转载自www.cnblogs.com/sandy-123/p/10491258.html