什么样的数据表使用auto increment?
Posted 杨社长的学习笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么样的数据表使用auto increment?相关的知识,希望对你有一定的参考价值。
1.表的设计
①建议所有表的自增ID全部使用bigint
② select 查询不使用orderby 顺序取决于底层实现
2.spu和sku的区别
spu 标准商品单元 standard product unit
sku 库存持有单元 stock keeping unit
spu ==> sku
3.一对一的数据关系
新闻 数据中的 正文 ,可能比较大的数据应给被拆分。
新闻信息表和新闻正文表;
目的: 为了查询的时候影响效率。
像 spu和sku 这样数据量可能非常大的表,主键ID不要使用自动编号 auto increment
Python-数据类型 主键auto_increment
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)
int (*****) 4字节
bigint(***)8字节
smallint 2字节
mediumint 3字节
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、强调:对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制
所以在创建表示,如果字段采用的是整型类型,完全无需指定显示宽度,
默认的显示宽度,足够显示完整当初存放的数据
# 显示时,不够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、分类:
date:1999-01-27
time: 11:11:11
datetime*****:1999-01-27 11:11:11
year:1999
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‘)
);
3.约束****
是一种对数据限制
已经学习过的 数据类型 unsigned无符号 字符串长度 浮点的长度
约束的作用是?
为了保证数据的正确性,完整性
例如要存储密码 char(20) 只限制了类型和长度, 无法保证数据的正确性
额外的约束
语法:
创建时指定约束
create table 表名称(字段名 类型(长度) 约束名称1 约束名称n,....)
后期修改的方式添加 约束
alter table 表名称 modify 字段名 类型(长度) 约束名称1 约束名称n,....
NOT NULL 非空约束 限制该字段的值不能为空
UNIQUE 唯一性约束 限制该字段的值是唯一的不能出现重复
DEFAULT 默认值约束 如果插入数据时没有指定该字段的值则使用默认值
PRIMARY KEY 主键约束 限制该字段 不能为空 并且是唯一的 可以唯一标识一条数据 *****
FOREIGN KEY 外键约束 用来指向另一个表的主键
#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的核心功能存取数据
mysql存储引擎就是负责存取数据那一段代码
小结
建表完整语句
数据类型
整数(长度) 显示宽度 与存取没有关系
char定长 varchar可变长
sql_mode 严格模式
存储引擎
以上是关于什么样的数据表使用auto increment?的主要内容,如果未能解决你的问题,请参考以下文章
获取 SQLite 数据库的下一个 AUTO_INCREMENT 值
mysql中auto_increment(整数)的限制是多少