图片 13

MySQL中主键为0与主键自排约束的关系详解(细节)

说得简单一点就是,增加主键自排约束后:

现在主键是没有0的,如果把某个id改成0的话,0不会变!直接会进行排序;

 图片 1

图片 2

mysql基本操作,

数据库及表的操作

增:

创建数据库:create database mpc [charset utf8];(设置数据库编码)

创建数据表:create table [if not exists]
表名(字段1,字段2…[索引1,索引2…,约束1,约束2…])[表选项1,表选项2…];

字段设定形式:
字段名 类型 [字段属性1,字段属性2…]
类型:int ,tinyint, float, double, char, varchar, text, datetime, date,
time, timestamp…
字段属性:
auto_increment:整数自增(一定是主键)
primary
key:设定主键,且是唯一的,一个表里面只能设置一个,不能为空(null)
unique
key:设定唯一索引,一个数据表里面可以设置多个唯一索引,这个字段中可以多个值为空(null)
not null:不能为空
default:设定默认值
comment ‘字段说明文字’:字段的说明;

create table if not exists createtest(
id int auto_increment primary key,
name varchar(40) not null unique key,
password varchar(40) not null,
age tinyint default 18,
email varchar(40) comment '电子邮件'
);

索引:对数据库内部的某个表所有数据进行预先的某种排序;
普通索引:key(字段名);
唯一索引:unique key(字段名);
主键索引: primary key(字段名);
联合主键:primary key(多个字段名用逗号隔开);
全文索引:fulltext(字段名);
外键索引:foreign key(字段名) references
表名(字段名);(一个表的字段是另一个表的某个字段(一定得是主键),如果输入的值不再外面表的字段里,则不能录入)

create table tab1_key(
id int auto_increment,
name varchar(20) not null,
emai varchar(50) not null,
age int not null default 18,
grades1 int,
primary key(id),
unique key(name),
foreign key(grades1) references tab2_key(grades2)
);
create table tab2_key(
stu_id int not null,
teacher varchar(20) not null,
floor int not null,
grades2 int auto_increment primary key
);

约束:要求数据满足什么条件的一种规定
唯一约束:unique key(字段名);
主键约束: primary key(字段名);
外键约束:foreign key(字段名) references
表名(字段名);(一个表的字段是另一个表的某个字段(一定得是主键),如果输入的值不再外面表的字段里,则不能录入)
非空约束:not null;设定一个字段时不能为空值
默认约束:default XX值,设定一个字段的默认值为xx;
检查约束:check(某种判断语句)

create table tab_check(
age tinyint,
check (age>0 and age<100)
);-- 但是mysql并不能生效,语法能够通过

表选项:创建一个表的时候,对该表的整体设定:
charset=要使用的字符编码;
engine=要使用的存储引擎(也叫表类型);(默认是InnoDB)

关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。这篇博文将总结和分析各个引擎的特点,以及适用场合,并不会纠结于更深层次的东西。我的学习方法是先学会用,懂得怎么用,再去知道到底是如何能用的。下面就对MySQL支持的存储引擎进行简单的介绍。

图片 3

auto_increment=设定当前表的自增长字段的初始值,默认是1
comment=‘该表的一些说明文字’create table 表2 like 表1;

按照一个表的结构创建一个新表:created table 表1 like 表2;

在已有的表结构中插入相似表结构表中的所有数据:insert into 表1 select *
from 表2;

删:

删除数据库:drop database [if exists] 数据库名;(if
exists如果不存在不会报错)

删除数据表:drop table [if exists] 表名;(if
exists如果不存在不会报错)

改:

修改数据表:
添加字段:alter table 表名 add [column] 新字段名 字段类型
[字段属性列表];
修改字段:alter table 表名 change [column] 旧字段名 新字段名 字段类型
[字段属性列表];
删除字段:alter table 表名 drop [column] 字段名;
添加普通索引:alter table 表名 add
key(字段名1[,字段名2,字段名3…]);
添加唯一索引(约束):alter table 表名 add unique
key(字段名1[,字段名2,字段名3…]);
添加主键索引(约束):alter table 表名 add primary
key(字段名1[,字段名2,字段名3…]);

图片 4

 

数据的操作

 

增:

形式1、insert [into] 表名[(字段名1,字段名2,…)]
values(值表达式1,值表达式2,…),(…),…;

  最常用的插入语句,可以一次性插入多行数据,用逗号隔开;其中的值表达式可以是一个“直接值”或“函数调用结果”;如果对应字段是字符或时间类型,值应该使用单引号;

形式2、replace [into]表名[(字段名1,字段名2,…)]
values(值表达式1,值表达式2,…),(…),…;

  用法和形式1相同,唯一区别是如果插入语句的主键或唯一键相同,则会直接替换已经存在的数据;

形式3、insert [into] 表名[(字段名1,字段名2,…)]
select 字段名1,字段名2,…from 其他表名;

  将select语句查询的结果数据都插入到指定的表中,需要注意select语句查询出来的对应字段;

形式4、insert [into] 表名 set 字段名1=值表达式1,字段名2=值表达式2,…;

形式5、load data infile ‘文件名(绝对路径)’ into table 表名;

  load
data:适用于载入如下图所示的“结构整齐的文本数据”(要注意有的编辑器会给文档头部添加BOM字符来占位,以致于不能够载入)

图片 5

图片 6

删:

delete from 表名 [where 条件] [order by 排序字段] [limit
限定行数];

  删除数据依然是以“行”为单位进行,通常删除数据都应该带上where条件否则就会删除所有数据(极度危险),order
by 和limit 是为了筛选一些特定的数据,在实际应用中用得较少;

改:

update 表名 set 字段1=值1,字段2=值2,…[where 条件] [order by
排序字段] [limit 限定行数];

  通常update语句也都带上where条件,否则就是对所有数据进行修改(极度危险),order
by 和limit 是为了筛选一些特定的数据,在实际应用中用得较少;

查:

select [all | distinct] 字段或表达式列表 [from子句] [where 子句]
[group by 子句] [having 子句] [order by 子句] [limit 子句]

字段:来源于表,表达式:类似于8+3,now()等

图片 7 图片 8

all默认值:显示所有数据;
distinct:显示所有非重复的数据;
as:另起别名。select id as 序号 from tab1;

where 类似于其他语言的if条件判断语句,有true 和false 表示永真和永假

   where子句是对from子句中的“数据源”中的数据进行筛选的条件设定,筛选的机制是“一行一行”进行判断,其作用和其他语言的
if
语句相似;where子句通常都需要使用各种运算符:算术运算符(+,-,*,/,%),比较运算符(>,<,>=,<=,[=,<>]国际标准的等于和不等于,==,!=),逻辑运算符(and,or,not)。

  select * from test where id>2 and sex!=’man’;
id大于2且sex不等于man;

  select * from test where id>2 or sex=’man’;
id大于2或者sex等于man;

  select * from test where not(sex=’man’); sex不等于man;

group by子句是用于对已经查询出的数据进行分组

  group by 字段1[desc|asc],字段2[desc|asc],…;
分组的结果可以指定排序方式默认是asc(正序),通常分组使用一个字段,2个以上的字段很少

  分组过后的数据就剩下一个一个组了,所以尽量不输出所有字段,有的字段不能针对一个组(比如带有姓名,年龄,性别字段的数据表以性别字段分组过后,姓名和年龄字段就没有意义了),所以分组过后一般有用的信息就是总量[count(*)得出该组共有多少数据],和原来数据中的数据类型字段的聚合信息[max(age)得出最大年龄,min(age)得出最小年龄,avg(age)得出平均年龄,sum(age)得出所有人年龄的总和]。

  select 班级,count(*) as 人数, max(体育成绩) as
体育成绩最高分,min(体育成绩) as 体育成绩最低分,avg(体育成绩) as
体育成绩平均分,sum(体育成绩) as 所有人体育成绩总和 from test group by
班级;

having
子句的作用和where完全一样,但是是对已有的分组数据进行筛选,所以having子句一定在group
by子句使用后才能使用

  select 班级id,count(*) as 人数, max(体育成绩) as
体育成绩最高分,min(体育成绩) as 体育成绩最低分,avg(体育成绩)
as 体育成绩平均分,sum(体育成绩) as 所有人体育成绩总和 from test group by
班级id having 体育成绩平均分>60;

order by
子句是将前面已经取得的数据以设定的字段进行排序后输出(desc倒序,asc顺序,默认是asc)

  order by 字段1 [asc|desc], 字段2 [asc|desc], …;
多个字段的排序都是建立在上一个排序的基础上如果还有“相等值”再继续排序;

  select * from test order by age;

  select * from test order by age, weight;

limit子句用于将已经得到的数据取出指定的几行出来

  limit 起始行号, 取出的行数;
起始行号从0开始计时,起始行号可以省略,省略后默认从第0行开始取出多上行;

  select * from test where order by age desc limit 0,1;

在select语句的形式上很多的子句都可以省略,但是如果出现他们的顺序不能被打乱,where子句依赖from子句,having子句依赖group
by子句,select
的字段依赖于from子句,有依赖关系的不能在所依赖的对象之前出现也不能凭空出现;用from语句查询出数据,使用where语句将查询的数据进行按需筛选,使用group
by语句将筛选过的数据进行分组,使用having子句将分组的数据进行筛选,使用order
by语句将筛选后的数据进行排序,用limite x,y语句将排序后的特定行输出。

  select classid,avg(age) as age from test where sex=’man’ group by
classid order by desc limit 0,1;

数据库及表的操作 增:
创建数据库:create database mpc [charset utf8];(设置数据库编码)
创建数据表: create table [if not exists…

开始不设置主键表的设计如下:

表的设计如下:

图片 9

图片 10

开始没0,增加主键自排约束,新添加的主键是0的行会根据行数自行变化,注意这里是新添加的行,使用的是insert。

  使用limit查看指定范围数据的时候这时候表就会是从0开始往下排的顺序,但是insert添加一行数据的时候反而是跟行数有关系,这时候又是按照从1开始往下排的顺序。如果使用主键自排约束以前表里有0,再设置完主键自排以后所有的0又不会根据行数,而是直接按照自上而下的顺序从1开始排。如果把表中的某个主键的数改成0,那直接就会进行排序放到正数前面,也就是说主键自排是允许有0存在的,那为什么本身存在的0要去修改成从1开始的递增序列呢?哪怕没加主键自排以前只有一个0,加了主键自排以后还是会变成1。

Insert 进去 id = 0的数据,数据会从实际的行数开始增加,和从0变化不一样;

再加上自排,果然跟想的一样,0要变成1了,错误提示说的是主键有重复的1所以不让自排,

 图片 11

新添加的0,不允许存在,要根据行号改变。

  开始没0,增加主键自排约束,新添加的主键是0的行会根据行数自行变化,注意这里是新添加的行,使用的是insert。

开始有0,增加主键自排约束,0依次变为1,2,3,4…….

再insert一个id=0的看看,居然还是跟刚才一样直接跟行数相关!

 图片 12

图片 13

再重置一下自动排序,看看这个0会不会有变化,先取消自排;

        新添加的0,不允许存在,要根据行号改变。

我觉得也就这几种情况吧,无符号的情况应该没什么区别,还有什么没有考虑的希望大家给我留言,可以告诉我你是怎么想的,我也很想知道,现在抛砖引玉我把我的总结和想法写一下:

  开始有0,增加主键自排约束,0依次变为1,2,3,4…….