1.存储引擎,mysql根据不同的表类型会有不同的处理机制。
2.表介绍
表相当于文件,表中的一条记录相当于文件的一行内容,表的一条记录有相应的标题,称为表的字段。
3.创建表
create table tablename(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
);
注意事项:
在同一张表中,字段 名不能相同
宽度和约束条件可选,非必须,
字段名和类型为必须
4.查看表结构
desc t1;(describe t1;) 查看表结构
show create table t1\G; 加上\G查看详细结构。
5 基础数据类型
主要包含四种类型:数字,字符串,时间,枚举
数字
tinyint, int, bigint
tinyint
有符号: -128 ~ 127
无符号: 0 ~255
mysql中无布尔值,使用tinyint(1)进行构造
int:
有符号: -2147483648 ~ 2147483647
无符号: 0 ~ 4294967295
bigint:
有符号: -9223372036854775808 ~ 9223372036854775807
无符号: 0 ~ 18446744073709551615
设置有无符号:默认有符号 create table t1(x int);, create table t2(x int unsigned);
int存储宽度是4bytes,即32bit.
浮点型:
定点数 类型,DEC等同DECIMAL
浮点类型,FLOAT, DOUBLE
FLOAT[(m,d),单精度浮点数,m是整数部分+小数部分总个数,最大值为255,d最大值为30,随着小数增多,越不准确。
DOUBLE[(m,d)],双精度浮点数,m是整数部分+小数部分总个数,最大255,d最大值为30,精度比float高,但也会不准确。
DECIMAL [(m,[,d]],准确的小数值,m是整数 部分+小数部分的总个数,d是小数点后个数,m最大65,d最大为30。精度始终准确
位类型:
BIT(M)可以用来存放多位进制数,m范围从1~64,如果不写默认为1位。
对于位字段需要用函数读取,bin()显示为二进制,hex()显示为十六进制
日期类型:
日期类型包括:DATE, TIME,DATETIME, TIMESTAMP, YEAR
year: yyyy(范围: 1901/2155)
date: yyyy-mm-dd(范围: 1000-01-01/9999-12-31)
time HH:MM:SS(范围: ‘-838:59:59’/‘838:59:59’)
datetime: YYYY-MM-DD HH:MM:SS(范围:1000-01-01 00:00:00/9999-12-31 23:59:59)
timestamp: YYYYMMDD HHMMSS(范围:1970-01-01 00:00:00/2037)
datetime与timestamp区别;
datetime的日期范围是1001-9999,timestamp是1970-2038
datetime存储时间与时区无关,timestamp存储时间与时区相关,显示值也依赖时区。
datetime使用8字节存储空间,timestamp存储空间为4字节,timestamp空间利用效率更高
datetime默认值为null,timestamp字段默认不为空,为当前时间current_timestamp,如果不做特殊处理,并且update语句没有指定该列的更新值,则默认更新为当前时间。
工作中一般用datetime就行
字符串类型
char类型, 定长,存取快速,但浪费空间
范围 0-255(一个中文是一个字符,是utf8编码的3字节),存储char类型时,会往右填充空格满足长度。
varchar 变长,精准,存储数度 慢,但节省空间。
字符长度范围0-65535,varchar类型存储数据的真实内容,不会用空格填充。如果字符里包含空格,空格也会被保存。varchar类型会在真实数据前加1-2bytes前缀,用来表示 真实数据 的bytes字节数。
真实数据<255bytes 1byttes前缀 2**8 255
真实数据>255bytes 2bytes前缀 2**16 65535
其他字符串类型:binary, varbinary, blob, text
枚举类型与集合类型
字段的值 只能在给定的范围内选反,如enum 单选,set多选
如:size enum('x-small','small','medium','large','x-alrge')
col set('a','b','c','d')
6.表的完整约束性
线束条件与数据类型的宽度一样,是可选参数,用于保证数据的完整性,一致性
主要有:
primary key (pk) 标识该字段为该表的主键,可以唯一的标识记录
foreign key (fk) 标识该字段为该表的外键
not null 标签该字段不能为空
unique key(uk) 标示字段的值是唯一的
auto_increment 标识该字段的值自动增长(整数类型,且为主键)
default 为该字段设置默认值
unsigned 无符号
zerofill 使用0填充
Not null 与default, 是否可空,null表示空,非字符串
not null - 不可空, null 可空
默认值,创建列时可以指定默认值,如未主动设置,则自动添加默认值
create table t1( id int not null default 2, num int not null);
注意:
如果非严格模式,int类型不传值的话会默认为0,因为Null不是int 类型,所以自动将null变成0存储
unique
独一无二,唯一属性,
primary key
主键primary key是innodb存储引擎组织数据的依据,innodb称之为索引组织表,一张表中有且只有一个主键
如果创建表时没有指定主键,not null, unique会被 默认当作主键
auto_increment
约束字段为自动增长,被约束的字段必须同时被key约束,也就是说只能给约束成key的字段加自增属性,默认起始位置为1,步长也为1。
创建表后修改字段起始值,
create table student(id int primary key auto_increment, name varchar(20);
alter table student auto_increment=3
或者创建表时就指定,但应写在括号外:
create tabel student(id int primary key auto_increment, name varchar(20) ) auto_increment=3;
步长:
mysql 自增的步长:
基于会话级别: set session auth_increment_increment=2 # 修改会话级别的步长
基于全局级别:set global auth_increment_increment=2 # 修改全局级别的步长
注意:
当auto_increment_offset > auto_increment_increment 时,auto_incremant_offset将忽略
foreign key
外键表明表与表之间的关系
主要作用:
先建立被关联的表的才能建立关联表
在插入数据记录的时候,要向被关联表中插入数据,才能往关联表里插入数据
更新或者删除数据的时候,需要考虑关联表和被关联表的关系:a删除表的时候,先删除关联表,再删除被关联表。b重建表的时候,在加外键的时候加上on_delete cascade on update cascade
-表关系的总结 :
找表关系的步骤:
1.先站在左表角度去找
如果左表的多条记录可以对应右表的一条记录,则表明左表的一个字段foreign key右表一个字段
2.再站在右表的角度去找
如果打开个的多条记录对应左表的一条记录,则右表一个字段foreign key左表一个字段
如果1成立,则左表多对一右表
如果2成立,则右表多对一左表
如果 两者同时成立,则是多对多
如果 都不成立,而是一条记录对应一条记录,则一对一
class Book(models.Model):
# 书籍
name = models.CharField(verbose_name='书名', max_length=20, )
price = models.DecimalField(verbose_name='价格', max_digits=5, decimal_places=2)
publish_date = models.DateField(verbose_name='出版日期', default=timezone.now)
press = models.ForeignKey(to='Press', related_name='press_book')
author = models.ManyToManyField(to='Author', related_name='author_book')
class Press(models.Model):
# 出版社
name = models.CharField(verbose_name='社名', max_length=32)
city = models.CharField(verbose_name='所在城市', max_length=32)
class Author(models.Model):
# 作者
name = models.CharField(verbose_name='姓名', max_length=32)
age = models.IntegerField(verbose_name='年龄')
author_detail = models.OneToOneField(to="AuthorDetail")
# 站在book表看,book中多本书可以由一个出版社,book表有foreign key press
# 站在book表看,book中一本书可以有多个作者,一个作者也可以有多本书,ManyToMany
# 站在author表看,author中一条记录有一条authordetail记录,一对一
约束外键的三种模式:
district 严格约束,默认的,父表不能删除或者更新已经被子表引用的记录
cascade 级联 模式,父表的操作,对应子表的关联数据也跟着操作
set null 置空模式,父表操作之后 ,子表对应的数据被置空
合理的约束模式:
删除的时候子表置空,更新的时候子表级联。
foreign key references 父表(主键字段) ondelete 模式 on update 模式;
7 修改表alter table
修改表名:alter table tablename rename new_table_name;
增加字段:alter table 表名 add 字段名 数据类型[完整性约束条件], add 字段名 数据类型[完整性约束条件];
add 字段名 数据类型[完整性约束条件], First;增加字段时把它放到第一个字段的位置
add 字段名 数据类型[完整性约束条件], after 字段名,放到指定字段名后
删除字段;alter table 表名 drop 字段名;
修改字段:alter talbe 表名 modify 字段名 数据类型[完整性约束];
alter table 表名 change 旧字段 名 新字段名 旧数据 [完整性约束条件]; #只改了字段名
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件]; 改了字段名及数据类型,约束条件等
8.复制表
语法: 复制表结构 + 记录 (key不会复制:主键,外键和索引)
create table new_service select * from service; # 这句话的意思是你从service表里面查询出来的数据不要在屏幕上打印了,你直接给我的新表new_service
只复制表结构,不要数据
select * from service where 1=2;//条件为假,查不到任何记录,所以我们可以通过它来只复制表结构
create table new_service select * from service where 1=2; 条件为假,只拿到了结构,所以只复制表结构