MySQL约束的使用

#修改某个字段的类型可以为空

alter table 表名称 modify 字段名 数据类型 NULL;

#去掉not null

alter table 表名称 modify 字段名 数据类型;

唯一性约束(UNIQUE)


作用

用来限制某个字段/某列的值不能重复(允许出现多个NULL值)

在这里插入图片描述

特点

  • 同一个表可以有多个唯一约束。

  • 唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯一。

  • 唯一性约束允许列值为空。

  • 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。

  • MySQL会给唯一约束的列上默认创建一个唯一索引。(删除唯一约束通过删除唯一索引来完成)

添加唯一约束

1)建表时:

字段后添加

#设置某列为唯一约束

create table 表名称(

字段名 数据类型,

字段名 数据类型 unique,

字段名 数据类型 unique key,

字段名 数据类型

);

在所有字段后添加

#可设置为联合唯一

create table 表名称(

字段名 数据类型,

字段名 数据类型,

字段名 数据类型,

[constraint 约束名] unique key(字段名)

);

可以设置多个列组合的值唯一。

例如:

#表示用户名和密码组合不能重复

CREATE TABLE USER(

id INT NOT NULL,

NAME VARCHAR(25),

PASSWORD VARCHAR(16),

– 使用表级约束语法

CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)

);

2)建表后

设置某一列

#在某一列后添加唯一约束

alter table 表名称 modify 字段名 字段类型 unique;

设置一列/一组为唯一约束

#字段列表中如果是一个字段,表示该列的值唯一。如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的

alter table 表名称 add unique key(字段列表);

复合唯一约束

如果没有设置约束名,那么将复合的第一个字段作为默认约束名。

#字段列表中写的是多个字段名,多个字段名用逗号分隔,表示那么是复合唯一,即多个字段的组合是唯一的

create table 表名称(

字段名 数据类型,

字段名 数据类型,

字段名 数据类型,

[constraint 约束名] unique key(字段列表)

);

删除唯一约束

上面我们说过,创建唯一约束时,会默认自动添加唯一索引。

  • 添加唯一性约束的列上也会自动创建唯一索引。

  • 删除唯一约束只能通过删除唯一索引的方式删除。

  • 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。

  • 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。

语法:

#通过删除索引名来删除唯一索引

ALTER TABLE USER

DROP INDEX uk_name_pwd;

如果不知到自己的索引名,可通过以下查询来查看索引名,然后进行删除

#查看表中都有哪些约束

SELECT * FROM information_schema.table_constraints WHERE table_name = ‘表名’;;

主键约束(PRIMARY KEY)


作用

非空约束规定不能为空但可以重复

唯一约束不能重复,但可以有多个NULL值

主键约束用来唯一标识表中的一行数据(可以说时非空约束和唯一约束的组合)

特点

主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值。

在这里插入图片描述

  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。

  • 主键约束对应着表中的一列或者多列(复合主键)

  • 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。

  • MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。

  • 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。

  • 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。

添加主键约束

1)建表时

某列后添加

#列级模式

create table 表名称(

字段名 数据类型 primary key,

字段名 数据类型,

字段名 数据类型

);

所有列后添加,可以添加组合主键,添加方式与唯一约束添加方式类似

#表级模式

create table 表名称(

字段名 数据类型,

字段名 数据类型,

字段名 数据类型,

[constraint 约束名] primary key(字段名)

);

2)建表后

可添加某一列/几列为主键

#字段列表可以是一个字段,也可以是多个字段,如果是多个字段的话,是复合主键

ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表);

注意:主键命称一定为PRIMARY KEY,不论你自己设置为什么。

复合主键约束

如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。

#表示字段1和字段2的组合是唯一的,也可以有更多个字段

create table 表名称(

字段名 数据类型,

字段名 数据类型,

字段名 数据类型,

primary key(字段名1,字段名2)

);

删除主键约束

删除主键约束

alter table 表名称 drop primary key;

说明:删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在。

自增列(AUTO_INCREMENT)


作用

某个字段的值自增,搭配主键或者唯一键列使用。

特点和要求

  • 一个表最多只能有一个自增长列

  • 当需要产生唯一标识符或顺序值时,可设置自增长

  • 自增长列约束的列必须是键列(主键列,唯一键列)

  • 自增约束的列的数据类型必须是整数类型

  • 如果自增列指定了 0 和 null,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接赋值为具体值。

指定自增约束

1)建表时

搭配主键或者唯一键列使用

create table 表名称(

字段名 数据类型 primary key auto_increment,

字段名 数据类型 unique key not null,

字段名 数据类型 unique key,

字段名 数据类型 not null default 默认值,

);

create table 表名称(

字段名 数据类型 default 默认值 ,

字段名 数据类型 unique key auto_increment,

字段名 数据类型 not null default 默认值,

primary key(字段名)

);

2)建表后

#设置对应的字段为自增长列alter table 表名称 modify 字段名 数据类型 auto_increment;

删除自增约束

#给这个字段增加自增约束

alter table 表名称 modify 字段名 数据类型 auto_increment;

#删除自增约束 等同于重新定义

alter table 表名称 modify 字段名 数据类型;

MySQL 8.0新特性—自增变量的持久化

在MySQL 8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重启后,会重置。

AUTO_INCREMENT=max(primary key)+1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。

看下面的案列:

创建的数据表中包含自增主键的id字段,语句如下:

CREATE TABLE test1(

id INT PRIMARY KEY AUTO_INCREMENT

);

插入4个空值,执行如下:

INSERT INTO test1VALUES(0),(0),(0),(0);

查询数据表test1中的数据,结果如下:

mysql> SELECT * FROM test1;

±—+

| id |

±—+

| 1 |

| 2 |

| 3 |

| 4 |

±—+

4 rows in set (0.00 sec)

删除id为4的记录,语句如下:

DELETE FROM test1 WHERE id = 4;

再次插入一个空值,语句如下:

INSERT INTO test1 VALUES(0);

查询此时数据表test1中的数据,结果如下:

mysql> SELECT * FROM test1;

±—+

| id |

±—+

| 1 |

| 2 |

| 3 |

| 5 |

±—+

4 rows in set (0.00 sec)

从结果可以看出,虽然删除了id为4的记录,但是再次插入空值时,并没有重用被删除的4,而是分配了5。

删除id为5的记录,结果如下:

DELETE FROM test1 where id=5;

重启数据库,重新插入一个空值。

INSERT INTO test1 values(0);

再次查询数据表test1中的数据,结果如下:

mysql> SELECT * FROM test1;

±—+

| id |

±—+

| 1 |

| 2 |

| 3 |

| 4 |

±—+

4 rows in set (0.00 sec)

从结果可以看出,新插入的0值分配的是4,按照重启前的操作逻辑,此处应该分配6。出现上述结果的主要原因是自增主键没有持久化。

在MySQL 5.7系统中,对于自增主键的分配规则,是由InnoDB数据字典内部一个计数器来决定的,而该计数器只在内存中维护,并不会持久化到磁盘中。当数据库重启时,该计数器会被初始化。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后的内容

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)

如何准备面试?

1、前期铺垫(技术沉积)

程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问

这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!

  • Java程序员必看《Java开发核心笔记(华山版)》

  • Redis学习笔记

  • Java并发编程学习笔记

四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇

  • Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)

  • 大厂面试必问——数据结构与算法汇集笔记

其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。

2、狂刷面试题

技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。

①大厂高频45道笔试题(智商题)

②BAT大厂面试总结(部分内容截图)

③面试总结

3、结合实际,修改简历

程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
就不一一展示了。

[外链图片转存中…(img-R6ZMbumD-1711803495039)]

2、狂刷面试题

技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。

①大厂高频45道笔试题(智商题)

[外链图片转存中…(img-2TZOrVzh-1711803495039)]

②BAT大厂面试总结(部分内容截图)

[外链图片转存中…(img-SeMQXiuW-1711803495039)]

[外链图片转存中…(img-kbKO4biT-1711803495039)]

③面试总结

[外链图片转存中…(img-IiV0BrPP-1711803495040)]

[外链图片转存中…(img-I4T3ZBBR-1711803495040)]

3、结合实际,修改简历

程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:

[外链图片转存中…(img-vfPuFtSH-1711803495040)]

以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值