Python-数据类型 主键auto_increment

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


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

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

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

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

三、测试:
默认有符号的
设置为无符号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);

四、强调:对于整型来讲,数据类型后的宽度并非存储限制,而是显示限制
因此在建立表示,若是字段采用的是整型类型,彻底无需指定显示宽度,
默认的显示宽度,足够显示完整当初存放的数据

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的含义
测试:
#相同点
一、对于三者来讲,都能存放30位小数,
#不一样点:
一、精度的排序从低到高:float,double,decimal
二、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)

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

二、分类:
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或任意个任意字符 使用_表示一个任意字符

三、测试:字符的宽度限制单位是字符个数
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

日期和时间
一、做用:时间相关
二、分类:
year:1999
date:1999-01-27
time: 11:11:11
datetime*****:1999-01-27 11:11:11
timestamp *****
timestamp特色是:能够给null 自动输入当前时间 当这条记录被修改了会自动更新当前时间
三、测试
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
#强调(******)
一、一张表中必须有,而且只能有一个主键
二、一张表中都应该有一个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注意点:
一、一般与primary key连用,并且一般是给id字段加
二、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    存在内存中 断电易失
相关文章
相关标签/搜索