mysql数据库--mysql字段属性(主键,唯一键,自增长)

回顾:

字段类型(列类型):数值型,时间日期和字符串类型。
数值型:整数和小数型(浮点型和定点型)
时间日期型:datetime,date,time,timestamp,year。
字符串类型:定长,变长,文本字符串(text和blob),枚举(单选)和集合(多选)。
mysql的 记录长度:65535,varchar达不到理论长度,NULL要占用一个字节,text文本不占用记录长度(但是本身占据一个字节)
字段的属性:空属性,列描述,默认值

字段属性:

主键,唯一键和自增长。

主键:

主键:primary key主要的键,一张表中只能有一个字段可以使用对应的键,用来唯一的约束字段里面的数据,不能重复,
这样称之为主键。一张表最多有一个主键。

增加主键:

SQL操作中有多种方式可以给表增加主键,大体分为三种:
方案一:在创建表的时候直接在字段之后跟primary key关键字
主键本身不允许为空。
-- 增加主键
create table my_pri1(
name varchar(20) not null comment '姓名',
number char(10) primary key comment '学号:itcast + 0000,不能重复'
)charset utf8;
优点:非常直接,缺点:只能使用一个字段作为主键。

在这里插入图片描述

方案二:

在创建表的时候,在所有的字段之后,使用primary key(主键字段列表)来创建主键(如果有多个字段作为主键,可以是复合主键)
-- 复合主键
create table my_pri2(
number char(10) comment '学号:itcast + 0000',
course char(10) comment '课程代码:3901 + 0000',
score tinyint unsigned default 60 comment '成绩',
-- 增加主键限制:学号和课程号是个对应的具有唯一性
primary key(number,course)
)charset utf8;

在这里插入图片描述

方案三:

当表已经创建好了之后,再次追加主键,一是可以修改表字段属性,二是可以直接追加主键。
alter   table  表名    add    primary   key(字段列表);

创建没有主键的表:

-- 创建一个没有主键的表
create table my_pri3(
course char(10) not null comment '课程编号:3901 + 0000',
name varchar(10)not null comment '课程名字'
);

desc my_pri3;

在这里插入图片描述

modify方式增加主键:

-- 增加主键
alter table my_pri3 modify course char(10) primary key comment '课程编号:3901 + 0000';

desc my_pri3;

在这里插入图片描述

alter方式增加主键:

create table my_pri4(
course char(10) not null comment '课程编号:3901 + 0000',
name varchar(10)not null comment '课程名字'
);
desc my_pri4;

在这里插入图片描述

alter table my_pri4 add primary key (course);
desc my_pri4;
前提:表中字段对应的数据本身是独立的(不重复)

在这里插入图片描述

主键约束:

主键对应的字段中的数据不允许重复,一旦重复数据操作失败(针对于增和改)
-- 向pri1,pri2表中插入数据
insert into my_pri1 values('xfl','itcast0001'),('xyy','itcast0002');
insert into my_pri2 values('itcast0001','39010001',90),('itcast0001','39010002',85),('itcast0002','39010001',92);

select * from my_pri1;
select * from my_pri2;

在这里插入图片描述

-- 主键冲突(重复)
insert into my_pri1 values('lh','itcast0002');   -- 不可以,主键冲突
insert into my_pri2 values('itcast0001','39010001',100); -- 不可以,冲突

在这里插入图片描述

更新主键 & 删除主键

没有办法更新主键:主键必须先删除才可以增加。
alter    table    表名     	drop     primary   key;
-- 删除主键
desc my_pri3;
alter table my_pri3 drop primary key;
desc my_pri3;

在这里插入图片描述

主键分类:

在实际创建表的过程中,很少使用真实业务数据作为主键字段(业务主键,如学号,课程号);大部分的时候使用逻辑性
的字段(字段没有业务含义,值是什么都没有关系),将这种字段的主键称之为逻辑主键。
create   table   my_student(
id   int   primary   key   auto_increment    comment   '逻辑主键:自增长',     -- 逻辑主键
number   char(10)    not   null   comment   '学号',
name    varchar(10)    not  null
)

自动增长:

自增长:当对应的字段不给值或者说是给默认值,或者给NULL的时候,会自动的被系统触发,系统会从当前字段中已有的最大值
再进行+1操作,得到一个新的不同的字段。自增长通常是跟主键搭配。
自增长的特点:auto_increment
1.任何一个字段要做自增长必须前提是本身的一个索引(key-栏有值),主键本身是一种索引。
-- 自增长
create table my_auto(
id int auto_increment comment '自动增长',
name varchar(10) not null
)charset utf8;

在这里插入图片描述

2.自增长字段必须是数字而且是整型
-- 自增长
create table my_auto(
id varchar(1) primary key auto_increment comment '自动增长',
name varchar(10) not null
)charset utf8;

在这里插入图片描述

3.一张表只能有一个自增长

在这里插入图片描述

自增长的使用:

当自增长被给定的值为NULL或者默认值的时候会触发自动增长。
自增长如果对应的字段输入了值,那么自增长失效,但是下一次还是能够正确的自增长(从最大值+1)

在这里插入图片描述

-- 指定数据
insert into my_auto values(6,'hsh');
insert into my_auto values(null,'csy');
select * from my_auto;

在这里插入图片描述

如何确定下一次是什么自增长呢?可以通过查看表创建语句得到。

show    create   table   my_auto;

在这里插入图片描述

修改自增长:

自增长如果是涉及到字段改变,必须先删除自增长,后增加自增长(一张表只能有一个自增长)
修改当前自增长已经存在的值,修改只能比当前已有的自增长的最大值大,不能小(小不生效)
alter    table    表名    auto_increment = 值;
-- 修改表选项的值
alter table my_auto auto_increment =4; -- 向下修改(小)
show create table my_auto;

alter table my_auto auto_increment =10; -- 向上修改(大)  
show create table my_auto;

在这里插入图片描述

思考:为什么自增长是从1开始?为什么每次自增1呢?

所有系统的表现(如字符集,校对集都是由系统内部的变量进行控制的)
查看自增长变量:
show   variables   like   'auto_increment%';

在这里插入图片描述

可以修改变量实现不同的效果:修改是对整个数据的修改,而不是单张表:(修改是会话级别,单次连接有效,例如打电话)
set   auto_increment_increment = 5;
-- 修改自增长步长
set auto_increment_increment = 5;
show create table my_auto;

在这里插入图片描述

测试效果:自动使用自增长:

-- 插入记录:使用自增长
insert into my_auto values(null,ly);
show create table my_auto;
select * from my_auto;

在这里插入图片描述

再次插入数据验证自增长:

insert into my_auto values(null,'lyl');
select * from my_auto;

在这里插入图片描述

删除自增长:

自增长是字段的属性:可以通过modify来进行修改(保证字段没有auto_increment即可)
alter   table  表名    modify   字段   类型;
错误的删除方式:
-- 删除自增长
alter table my_auto modify id int primary key;  -- 错误:主键理论是单独存在,不在自增长区域,系统会认为你又再一次的
增加主键,导致错误

在这里插入图片描述

正确的删除主键的方式:

-- 正确的删除方式
alter table my_auto modify id int;   -- 有主键的时候,千万不要再次写入主键重复添加

-- 查看效果
desc my_auto;

在这里插入图片描述

唯一键:

一张表中往往有很多字段需要具有唯一性,数据不能重复,但是一张表中只可以有一个主键:
唯一键:unique   key可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质与主键差不多:唯一键默认的允许自动为空,而且可以多个为空(空字段不参与唯一性比较)

增加唯一键:

基本与主键差不多:
方案一:在创建表的时候,字段之后直接跟unique,unique   key即可。
-- 唯一键
create table my_unique1(
number char(10) unique comment '学号:唯一,允许为空',
name varchar(10) not null
)charset utf8;

desc my_unique1;

在这里插入图片描述

方案二:在所有的字段之后增加unique   key(字段列表);  -- 复合唯一键
-- 创建唯一键的错觉
create table my_unique2(
number char(10) not null comment '学号',
name varchar(10) not null,
-- 增加唯一键
unique key(number)
)charset utf8;

desc my_unique2;

在这里插入图片描述

show    create   table    my_unique2;

在这里插入图片描述

方案三:在创建表之后增加唯一键
-- 创建表
create table my_unique3(
id int primary key auto_increment,
number char(10) not null,
name varchar(20) not null
)charset utf8;
-- 查看没有唯一键
desc my_unique3;
-- 增加唯一键
alter table my_unique3 add unique key(number);
desc my_unique3;

在这里插入图片描述

唯一键约束:

唯一键与主键的本质相同:唯一的区别就是唯一键默认允许为空而且可以多个为空。
插入数据
-- 首先进行查看
desc my_unique1;
-- 插入数据
insert into my_unique1 values(null,'lzg'),('itcast0001','cs'),(null,'ls');
-- 再次查看
desc my_unique1;
select * from my_unique1;

在这里插入图片描述

验证唯一键约束:

如果唯一键也不允许为空,与主键的约束作用就是一致的。
-- 不为空的字段重复插入会报错
insert into my_unique1 values('itcast0001','cf');

在这里插入图片描述

更新唯一键和删除唯一键:

更新唯一键先删除在新增(唯一键有多个,可以不删除,对同一个字段使用的话需要先删除)
删除唯一键:
alter    table    表名   drop   unique  key;   -- 错误,因为唯一键存在很多个
alter    table    表名   drop   index   索引名字;  --  唯一键默认使用字段名作为索引名字
-- 删除唯一键
desc my_unique3;
alter table my_unique3 drop index number;
desc my_unique3;

在这里插入图片描述

  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

Logbook怪

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值