Python-数据类型 主键auto_increment

MySQL数据操作: DML
========================================================
在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,
包括:
使用INSERT实现数据的插入
UPDATE实现数据的更新
使用DELETE实现数据的删除
使用SELECT查询数据以及。
========================================================


1.详细的建表语句 *****
create table 表名(
字段名1 数据类型[(长度) 约束条件],
字段名2 数据类型[(长度) 约束条件]
);

解释:
类型:使用限制字段必须以什么样的数据类型传值
约束条件:约束条件是在类型之外添加一种额外的限制
为什么需要给数据分类?(189 一八九)
1.描述数据更加准确
2.节省内存空间
注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选,字段名和类型是必须的
3、最后一个字段后不加逗号
create database db37;

insert 语句
insert into 表名 values(值1,值n,....)
要求值得顺序 个数 必须与表字段完全对应
另一种写法
insert into 表名(字段名1,字段名n,....) values(值1,值n,....)
可以选择性得插入某些字段 要求值得顺序 必须与表名后面声明得字段一致

2.数据类型 *****
整数类型
1、作用:id号,各种号码,年龄,等级
2、分类:
整型的存储宽度是规定死的,我们指定宽度是显示宽度,通常使用默认的显示宽度
tinyint(**)1字节 (-128,127)
smallint 2字节
mediumint 3字节
int (*****) 4字节
bigint(***)8字节

3、测试:
默认有符号的
设置为无符号unsigned
1.create table t2(age tinyint unsigned);
2.建表后用alter修改

create table t2(x tinyint unsigned);
insert into t2 values(-1),(256);

create table t4(x int(12) unsigned);
insert into t4 values(4294967296123);

4、强调:对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制
所以在创建表示,如果字段采用的是整型类型,完全无需指定显示宽度,
默认的显示宽度,足够显示完整当初存放的数据

zerofill
# 显示时,不够8位用0填充,如果超出8位则正常显示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(4294967296123);
insert into t5 values(1);

总结:除了存储范围没啥区别
都是整型
默认有符号
对于显示宽度 原理是相同的

长度参数如果不指定 会有默认值(3)

严格模式
什么是严格模式
对插入的数据严格要求 不再范围内直接报错
例如往tinyint中插入大于255的值将报错
什么是非严格模式
不对插入的数据严格要求 不再范围内也可以保存
保存的当前类型最大支持的值

5.6默认是非严格模式
5.7以后默认严格模式

查看SQL模式
select @@sql_mode;
show variables like "sql_mode";
show variables like "%sql_mode%";

修改SQL模式
set @@sql_mode = "值";
正常情况不需要改
+----------------------------+---------------------+
| Variable_name | Value |
+----------------------------+---------------------+
| binlogging_impossible_mode | IGNORE_ERROR |
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | OFF |
| pseudo_slave_mode | OFF |
| slave_exec_mode | STRICT |
| sql_mode | STRICT_TRANS_TABLES |
+----------------------------+---------------------+
8 rows in set (0.00 sec)

#修改sql_mode为严格模式:在该模式下,如果插入的数据超过限制,则会立即报错
mysql> set global sql_mode="strict_trans_tables";

浮点类型
作用:存储身高、体重、薪资
分类:
float (*****)4字节 单精度浮点 满足大部分使用场景
double (**)8字节双精度浮点
decimal (**)不固定 精准小数 适合银行系统 科学研究等
create table t9(num float(m,d))
m 表示总长度 d 表示小数部分的长度
长度表示不是数据存储范围 而是字符长度
10.12 总长为4 小数部分为2

各个类型的最大长度
float (255,30) ***** 括号内不填,默认没有小数,整数非零的数字显示6位
double (255,30)
decimal (65,30)

区别:
float与double的精度不同 都是不准确的小数
decimal 准确的小数 不会丢失精度

括号中m和d的值 可以限制数据存储范围 与整型不同
重点:记住m和d的含义
测试:
#相同点
1、对于三者来说,都能存放30位小数,
#不同点:
1、精度的排序从低到高:float,double,decimal
2、float与double类型能存放的整数位比decimal更多


create table t9(x float(255,30));
create table t10(x double(255,30));
create table t11(x decimal(65,30));

insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111);
insert into t11 values(1.111111111111111111111111111111);


mysql> select * from t9;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t10;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t11;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
1 row in set (0.00 sec)

字符串类型
1、作用:姓名,地址,描述类的信息

2、分类:
char 定长字符串 使用频率更高
varchar 可变长度字符串
注意字符串中 长度指定的是数据的字符长度 与字节没关系

create table t13(c1 char,c2 varchar(10));
在创建时 varchar必须指定长度 char有默认值 (1)

不同点:
a char(3) b char(3)
A |B |
char类型在取数据时 就根据长度来获取 不关心真实数据长度
无论的数据有多长 占用的空间是固定的 造成了一定空间浪费
name char(5)
# 缺点:浪费空间
# 优点:存取速度都快
egon alex lxx wxx yx

a varchar(30) b varchar(30)
(1)A(1)B
varchar类型在取数据时 先获取数据长度 在根据长度获取真实数据 关心真实数据长度
先存储长度需要一个字节 再存储真实数据 不会浪费空间
但是 由于需要计算数据的长度 所以存取速度会比定长慢
name varchar(5)
# 缺点:存取速度都慢
# 优点:节省空间
(1bytes+egon)(1bytes+alex)(1bytes+lxx)

相同点:
括号中的数字 都是表示存储最大字符长度

mysql会在存储数据时自动将数据末尾的空格去掉
如果必须要存空格 需要修改sql_mode 增加 PAD_CHAR_TO_FULL_LENGTH 意思是把空格当作有效数据

# 注意:
由于自动去除空格这个机制 在使用等于符号 和like时有区别
select *from t1 where name = "yh "; name字段明确地等于一个值,该值后填充空格是没有用,会自动去除空格
select *from t1 where name like "yh "; name字段模糊匹配一个值,该值后填充空格是有用的,不会自动去除空格
like 用于模糊匹配 使用%表示0或任意个任意字符 使用_表示一个任意字符

3、测试:字符的宽度限制单位是字符个数
create table t12(x char(4)); # 超出4个字符则报错,不够4个字符则用空格补全成4个字符
create table t13(y varchar(4));# 超出4个字符则报错,不够4个字符那么字符有几个就存几个

insert into t12 values('hello');
insert into t13 values('hello');

insert into t12 values('a'); #'a '
insert into t13 values('a'); #'a'

set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
select char_length(x) from t12; #4
select char_length(y) from t13; #1

日期和时间
1、作用:时间相关
2、分类:
year:1999
date:1999-01-27
time: 11:11:11
datetime*****:1999-01-27 11:11:11
timestamp *****
timestamp特点是:可以给null 自动输入当前时间 当这条记录被修改了会自动更新当前时间
3、测试
create table student(
id int,
name char(16),
born_year year,
birth date,
class_time time,
reg_time datetime
);

insert into student values(1,'egon','2000','2000-01-27','08:30:00','2013-11-11 11:11:11');

枚举
枚举enum,多选一个
enum 可以指定一堆字符串的值 在插入数据时 数据必须这堆字符串中的其中一个 ("男的","女的") 多选一
集合
集合set,多选多
set 可以指定一堆字符串的值 在插入数据时 数据必须这堆字符串中的其中一个或多个 ("男的","女的") 多选多
枚举和集合共同点:数据都是字符串类型
测试
create table teacher(
id int,
name char(16),
sex enum('male','female','others'),
hobbies set('play','read','music','piao')
);
insert into teacher values('male','read,music')

3.约束****
是一种对数据限制
已经学习过的 数据类型 unsigned无符号 字符串长度 浮点的长度

约束的作用是?
为了保证数据的正确性,完整性
例如要存储密码 char(20) 只限制了类型和长度, 无法保证数据的正确性

额外的约束
语法:
创建时指定约束
create table 表名称(字段名 类型(长度) 约束名称1 约束名称n,....)
后期修改的方式添加 约束
alter table 表名称 modify 字段名 类型(长度) 约束名称1 约束名称n,....
unsigned 整形,无符号
NOT NULL 非空约束 限制该字段的值不能为空
UNIQUE 唯一性约束 限制该字段的值是唯一的不能出现重复
DEFAULT 默认值约束 如果插入数据时没有指定该字段的值则使用默认值
PRIMARY KEY 主键约束 限制该字段 不能为空 并且是唯一的 可以唯一标识一条数据 *****
FOREIGN KEY 外键约束 用来指向另一个表的主键
auto_increment 自动增长,只能加在整形上且必须有索引和key配合,默认起始位置是1,步长也为1

mysql中存在一种专门的数据结构,叫key,又称为索引,通过该数据结构可以减少io次数,从而加速查询效率
index key : 只有加速查询的效果,没有约束的功能
unique key:不仅有加速查询的效果,还附加了一种约束的功能
primary key:不仅有加速查询的效果,还附加了一种约束的功能,并且innodb存储引擎会按照主键字段的值
来组织表中所有的数据,所以一种inndob表中必须有、而且只能有一个主键,通常该表的id字段

#not null + default测试
create table t15(
id int,
name char(16) not null,
sex enum('male','female','other') not null default "male"
);

alter table t15 modify name char(16) not null;

insert into t15(id,name) values
(1,'egon1'),
(2,'egon2'),
(3,'egon3');

每一个表都应该有一个主键 需要唯一标识 否则可以可能出现完全相同的两个数据 无法区分
UNIQUE 不能重复 但是可以为空 这样也不能唯一标识
UNIQUE NOT NULL 不能为空且唯一 可以唯一标识一条数据 书写顺序无所谓


UNIQUE NOT NULL 与 主键的区别
UNIQUE NOT NULL 不能被其他表引用 (不能作为其它表的外键)
UNIQUE NOT NULL 约束一个表中可以有多个 但是主键只能有一个
#unique:限制字段的值唯一

#单列唯一
create table t16(
id int unique,
name char(16)
);

# 联合唯一
create table server(
id int unique,
ip char(15),
port int,
unique(ip,port) #!!!!!
);


索引:用于加速查询
InnoDB 中 索引是树形结构
为了提高查询效率 InnoDB为找一个不为空 且唯一的字段作为主键
如果表中不存在这样的字段 会自动帮你建一个隐藏主键字段 但是无法提升查询效率

只要是使用innoDB 就应该为每个表指定一个非空 且唯一的字段
InnoDB阻止数据时 首先使用主键 如果没有主键 找一个非空且唯一 如果也没有 建一个隐藏字段


多字段联合主键: 不常用
学生表 stu_id course_id 做为联合主键,只有当两个字段都重复才算重复
1 1 已有数据
1 2 可以插入
2 1 可以插入
1 1 不能插入

#primary key:单单从约束角度去看,primary key就等同于not null unique
#强调(******)
1、一张表中必须有,并且只能有一个主键
2、一张表中都应该有一个id字段,而且应该把id字段做成主键
如一张表中没有主键,第一个not null unique的字段会默认成为主键

create table t17(
id int primary key,
name char(16),
age int,
sex char(6)
)engine=innodb;

#联合主键
create table t19(
ip char(15),
port int,
primary key(ip,port) #!!!!
);




# auto_increment注意点:
1、通常与primary key连用,而且通常是给id字段加
2、auto_incremnt只能给被定义成key(unique key,primary key)的字段加

# primary key auto_increment
create table t20(
id int primary key auto_increment,
name char(16)
)engine=innodb;

当一个表中 由于业务需求没有一个非空且唯一的字段时 我们可以建一个新的字段专门作为主键
管理主键的值挺麻烦的 你得记录上一次的主键值
mysql可以帮你自动管理主键 auto_increment 自动增长
auto_increment 只能用于整型字段 并且该字段必须具备索引
所以 通常 主键都会加上auto_increment

手动修改自动增长计数
alter table 表名 auto_increment 新的值;
注意:如果新的值小于当前的最大值 是无效的

通常建一个表就要建一个主键 主键的类型通常是整型


存储引擎

mysql中建立的库===>文件夹
库中建立的表===>文件

现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:
比如处理文本用txt类型,处理表格用excel,处理图片用png等
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)

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

发动机
汽油机
柴油机 柴油价格便宜 动力还强 噪音大 不完全燃烧
电机 加速快 噪音小 续航问题

一个产品或服务的核心部分称之为引擎
mysql的核心功能存取数据
mysql存储引擎就是负责存取数据那一段代码

InnoDB!!! 默认,支持事物,行级锁,外键,支持外键,存储时1个文件
MyISAM 不支持事物,表级锁,不支持外键. 支持存储结构体 ,例如point x坐标y坐标 支持空间索引,存储时3个文件(数据,结构,事务)


    Blackhole 写进去就没了
Memory 存在内存中 断电易失


















posted @ 2018-11-20 21:18  逐梦~前行  阅读(3115)  评论(0编辑  收藏  举报