2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复比如,arr = 4, 2, 0, 3, 10 1 2 3 4把0想象成洞,任何非0数字都可以来到这个洞里,然后在原本的位置留下洞比如...返回变成任何一种有序的情况都可以,最少的数字搬动次数。来自谷歌。...对于第二种有序情况,我们可以先倒序遍历数组,找出每个数需要移动的最小距离,从而计算出需要移动的次数。最后比较这两种情况下的最小搬动次数,返回较小值即可。...注意事项:需要记录每个数是否被遍历过,以防止重复计算。数字只能搬家到洞里,并且走后留下洞,因此在交换过程中需要记录其中一个数字所在的位置作为洞的位置。...这种样子,至少交换几次// ans2 : 1 2 3 4 .... 0 这种样子,至少交换几次// m : 每个环里有几个数// next : 往下跳的位置n := len(nums)ans1, ans2
2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复 比如,arr = [4, 2, 0, 3, 1] 0 1 2 3 4 把0想象成洞...,任何非0数字都可以来到这个洞里,然后在原本的位置留下洞 比如4这个数字,来到0所代表的洞里,那么数组变成 : arr = [0, 2, 4, 3, 1] 也就是原来的洞被4填满,4走后留下了洞 任何数字只能搬家到洞里...对于第二种有序情况,我们可以先倒序遍历数组,找出每个数需要移动的最小距离,从而计算出需要移动的次数。 3. 最后比较这两种情况下的最小搬动次数,返回较小值即可。 注意事项: 1....需要记录每个数是否被遍历过,以防止重复计算。 2. 数字只能搬家到洞里,并且走后留下洞,因此在交换过程中需要记录其中一个数字所在的位置作为洞的位置。...这种样子,至少交换几次 // ans2 : 1 2 3 4 .... 0 这种样子,至少交换几次 // m : 每个环里有几个数 // next : 往下跳的位置 n := len(nums
、主键约束噢~ ---- 唯一约束 定义 唯一约束用于保证数据表中字段的唯一性,即表中字段的值不能重复出现。...创建复合唯一约束 在表级唯一性约束创建时,unique()的字段列表中,可以添加多个字段,组成复合唯一键,特点是只有多个字段的值相同时才视为重复记录。...主键约束通过primary key 定义,它相当于唯一约束和非空约束的组合,要求被约束字段不允许重复,也不允许出现null值。...表级约束的字段若只有一个,则为单字段主键与列级约束添加的效果相同;若有多个,则为复合主键,复合主键需要用多个字段来确定一条记录的唯一性,类似于复合唯一键。...插入数据 插入NULL时,会插入失败,提示id字段不能为NULL 插入重复值也会失败,提示”1“已经存在主键。
MySQL中,常用的几种约束 约束类型 非空 默认值 唯一 主键 自增 外键 关键字 not null Default unique primary key auto_increment foreign...若该字段为空,则数据库会报错。非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。...唯一约束是指定 table 的列或列组合不能重复,保证数据的唯一性。唯一约束不允许出现重复的值,但是可以为多个 null。 同一个表可以有多个唯一约束,多个列组合的约束。...PK 约束必须满足主键字段的值唯一、非空。 主键约束相当于 唯一约束+ 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。...(AUTO_INCREMENT) Auto_increment 是 MySQL 唯一扩展的完整性约束,当为数据库表中插入新纪录时,字段上的值会自动生成唯一的 ID。
用not null约束的字段不能为null值,必须给定具体的数据 创建表,给字段添加非空约束(创建用户表,用户名不能为空) mysql> create table t_user( -> id...A为基本表,B为信息表 1、外键涉及到的术语 外键约束 外键字段 外键值 2、外键约束、外键字段、外键值之间的关系 某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值 3、按外键约束的字段数量分类...',200); 上表中找出每个学生的班级名称 mysql> select s....:如果父表中的记录被删除,则子表中对应的记录自动被删除 父表——被外键引用的表 子表——引用父表中的健作为外健的表 on delete set null 表的关联列的值设置为null alter table...,当被参照的数据被删除是,参照该数据的那些数据的对应值将会变为空值
这些上下文包括将值插入到具有 JSON 数据类型的列中,或将参数传递给期望 JSON 值的函数(在 MySQL JSON 函数文档中通常显示为 JSON_doc 或 JSON_val),如下例所示: 将值插入...8.0.3 之前,在 JSON 列中插入值时也会执行这种“第一个重复键获胜”的规范化。...它们处理重复键的方式不同:JSON_MERGE_PRESERVE() 保留重复键的值,而 JSON_MERGE_PATCH() 丢弃除最后一个值以外的所有值。...JSON_MERGE_PATCH() 将每个参数视为一个由单个元素组成的数组(因此其索引为 0),然后应用“最后一个重复键获胜”逻辑仅选择最后一个参数。...OBJECT:如果两个 JSON 对象具有相同的键集,并且两个对象中的每个键都具有相同的值,则它们是相等的。
B、域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则)。...B、唯一值约束:一张表可以有多个列添加唯一值约束,一直允许一条记录为空值。 实体完整性,由主键和唯一性约束来实现,确保表中记录有一列唯一标识。...主键约束相当于唯一约束与非空约束的组合,主键约束列不允许重复,也不允许出现空值;多列组合的主键约束,列都不允许为空值,并且组合的值不允许重复。...,不允许插入重复的ID,如果不指定主键的值,默认为0。...column subject VARCHAR(20) default NULL; 2、创建非空约束 非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
主键索引:特殊的唯一索引,不允许有空值。 复合索引:将多个列组合在一起创建索引,可以覆盖多个列。 外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作。...B+树有如下特点: B+树每个节点可以包含更多的节点,这样做有两个原因,一个是降低树的高度。另外一个是将数据范围变为多个区间,区间越多,数据检索越快。...每个节点不再只是存储一个key了,可以存储多个key。 非叶子节点存储key,叶子节点存储key和数据。 叶子节点两两指针相互链接,顺序查询性能更高。...,因为Hash值的大小关系并不一定和Hash运算前的键值完全一样; Hash索引不能利用部分索引键查询,对于组合索引,Hash索引在计算Hash值的时候是组合索引键合并后再一起计算Hash值,而不是单独计算...Hash值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash索引也无法被利用; Hash索引在任何时候都不能避免表扫描,由于不同索引键存在相同Hash值,所以即使取满足某个Hash键值的数据的记录条数
临键锁 Next-Key Lock,等于记录锁 + 间隙锁,锁定一个范围,并且锁定记录本身。主要是阻止多个事务将记录插入到同一个范围内,从而避免幻读。...假如一个索引有10、11、13、20这四个值,那么该索引可能被锁定的区间为: ? 若事务T1已经通过临键锁锁定了如下范围: ? 当插入新的记录12时,则锁定的范围变成: ?...在InnoDB存储引擎的内存结构中,对每个含有自增长值的表都有一个自增长计数器。...从MySQL5.12版本开始,InnoDB存储引擎提供了一种轻量级互斥量的自增长实现方式。这种方式大大提高了自增长值插入的性能。...如果不加筛选条件(或者筛选条件不走索引),会升级为表锁 索引数据重复率太高会导致全表扫描:当表中索引字段数据重复率太高,则MySQL可能会忽略索引,进行全表扫描,此时使用表锁。
PRIMARY KEY主键约束不能重复,不能为空NOT NULL 非空约束不能为空DEFAULT默认约束插入数据时此列没有值插入,则使用默认值UNIQUE KEY唯一约束此列不能有重复值FROEIGN...set null方式:主动权在主表上,如果主表被依赖字段修改了,从表的外键字段会将值设置为Null,这里要求,外键字段不能有非空约束。...set default方式:主动权在主表上,如果主表被依赖字段修改了,从表的外键字段会将值设置为default,这里要求,外键字段必须有默认约束。...不支持 四、唯一约束(unique constraint) 一个表可以有多个唯一约束,唯一键意味着唯一,可以为NULL,这意味着除了NULL值其他的都必须唯一,而可以有多个NULL值。...如果想要显式向ID列插入特定的数值,那么,必须启用 Identity_Insert选项,该选项自动将ID值更新为ID列的最大值。
临键锁 Next-Key Lock,等于记录锁 + 临键锁,锁定一个范围,并且锁定记录本身。主要是阻止多个事务将记录插入到同一个范围内,从而避免幻读。...假如一个索引有10、11、13、20这四个值,那么该索引可能被锁定的区间为: ? 若事务T1已经通过临键锁锁定了如下范围: ? 当插入新的记录12时,则锁定的范围变成: ?...从MySQL5.12版本开始,InnoDB存储引擎提供了一种轻量级互斥量的自增长实现方式。这种方式大大提高了自增长值插入的性能。...外键与锁 如果没有为外键显示添加索引,InnoDB自动为外键创建索引,这样子避免表锁。 对于外键值的插入或更新,首先需要查询父表中的记录,即select父表。...如果不加筛选条件(或者筛选条件不走索引),会升级为表锁 索引数据重复率太高会导致全表扫描:当表中索引字段数据重复率太高,则MySQL可能会忽略索引,进行全表扫描,此时使用表锁。
---- 用来保护 “自增长计数器” 的锁 在Innodb中对于每个含有自增长值的表来说,其都会对应一个自增长计数器,如果多个线程同时尝试插入记录,那么该计数器就会存在竞态,因此需要锁来确保自增过程的原子性...因为非唯一二级索引列的值是允许重复的,因此在精确查询场景下,为了避免同一事务下多次查询返回之前不存在的行,需要使用Gap Lock锁住其前后区间,防止插入相同值的记录,这里就是防止插入age=21的记录...还有一点就是,对于唯一键值的锁定,Next-Key Lock降级为Record Lock仅存在于查询所有的唯一索引列,如果唯一索引列由多个列组成,也就是联合索引的情况下,查询仅是查找多个唯一索引列中的一个...COMMIT 用户通过索引查询一个值,并对该行加上一个S锁,那么即使查询的值不存在,其锁定的也是一个范围,因此若没有返回任何行,那么新插入的值一定是唯一的。...Innodb在锁定读场景下使用Next-Key Lock算法避免不可重复的问题,Mysql官方文档中将不可重复读的问题定义为幻读,但是个人认为幻读算是不可重复读的一个子集。
zerofill 多余的使用数字0填充 not null 非空 default 默认值 unique 唯一值 primary key 主键 foreign key 外键 auto_increment..., name varchar(32) ); 自增的特性 通俗的理解,序号删除了就会接着以前的序号往下排,或者插入了序号失败的就不计入,那么在mysql中,序号插入失败后台也会记录,比如插入id...用“换位思考”的方法 一对多 # 判断是否为一对多关系: -> 员工表和部门表举例 --->员工表的角度: 一个员工可以对应多个部门吗? 不可以!...,需要依据外键规定的部门编号来插入数据,部门编号是固定的,插入没有的部门编号报错 mysql> insert into emp(name,age,dep_id) values('Hammer',18,5...在创建表的时候,需要注意先创建没有设置外键的表 在插入数据的时候,要确保被关联表中有数据 在插入新数据的时候,外键字段只能填写被关联表中已经存在的数据 在修改和删除被关联表中的数据的时候,无法直接操作
读已提交:不可读取其他session尚未提交的数据,只有其他session数据已提交才能读取到,为不重复读。...幻读 事务在插入一条已经经过检查不存在的记录,但是插入结果是数据已经存在,之前的检查操作如同幻影。Mysql默认采用可重复读级别,所以只可能出现幻读的情况。 Mysql中如何使用ENUM?...ENUM是一个字符串对象,可以通过ENUM限制字段的取值范围。如果插入数据时字段的取值并非可选值之一,则会空串或者NULL代替用户想要插入的值。...等非事务安全表的存储引擎。...候选键:不含有多余属性的超键,也就是候选键去掉任何一个属性都不再属于超键。 我们举个简单的例子助于理解: 学生表中每个学生都有学号,性别,年龄,姓名,专业。
但是业务在发展过程中,或许需要扩展单个列的描述功能,这时,如果能用好 JSON 数据类型,那就能打通关系型和非关系型数据的存储之间的界限,为业务提供更好的架构选择。...它们在处理重复键的方式上有所不同:JSON_MERGE_PRESERVE()保留重复键的 值,而 JSON_MERGE_PATCH()丢弃除最后一个值以外的所有值。...JSON_MERGE_PRESERVE()通过组合数组中该键的所有唯一值来处理具有相同键的多个对象;然后将此数组用作结果中该键的值。...JSON_MERGE_PATCH() 丢弃从左到右查找重复键的值,以便结果仅包含该键的最后一个值。...与前两种情况一样,JSON_MERGE_PRESERVE()组合具有相同键的值;JSON_MERGE_PATCH()丢弃除最后一个键以外的所有重复键的值,如下所示: mysql>SELECT JSON_MERGE_PRESERVE
例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为 “0001”,那么该表中就不能出现另一条记录的 id 值也为 “0001”。...唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。...主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。...♞ 主键不能包含空值,但允许在外键中出现空值。也就是说,外键的每个非空值必须是主表主键存在内容。 ♞ 若一个表中的字段被另一个表关联则该字段不能直接删除。 ?...在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。默认值约束通常用在已经设置了非空约束的列,这样能够防止数据表在录入数据时出现错误。
数据库约束类型 not null :不允许某列存储空值(非空); unique :不允许你某列存储重复值(唯一); default :没有赋值的列存储默认值; primary key:主键约束,not...foreign key:外键约束,保证一个表中的数据匹配另一个表中的值的参照完整性。...测试:插入 id 为空的记录是否能成功插入 insert into student values (null,'张三',18); 3. unique 唯一 创建表的时候,指定某类的值不能重复。...create table student(id int unique, name varchar(20), age int); 上述命令指定 id 这一列的数据不能重复 测试:插入 id 重复的记录是否都能成功插入..., foreign key (classId) references class(id)); 在这个语句中, 定义一个外键的实际作用是,在这条语句执行后,确保 MySQL 插入外键中的每一个非空值已经在被参照表中作为主键出现
MySQL的外键 1. default 概念 - 指定某列的默认值,插入数据时候,此列没有值,则用default指定的值来填充 添加 - 在创建表的时候添加: create .... default...,保证数据的唯一性 - 不能出现重复的值,但是可以有多个null - 同一张表可以有多个唯一的约束 添加唯一约束 - 在创建表的时候添加: create .... unique - create...6. unsigned: 无符号约束 概念 - 指定当前列的数值为非负数 - age tinyint 1 -128~127 unsigned 0~255 添加 - 在创建表的时候添加: create...建立参照完整性,一个表可以有多个外键,每个外键必须参照另一个主键。...); 注意: - 插入数据时,先插入主表的数据,再插入从表的数据 - 删除数据时,先删除从表的数据,再删除主表的数据 数据库的设计 主键约束 自增长约束 外键约束(慎用) 唯一约束 非空约束
enum在插入数值时,除插入枚举所给的选项外,也可以插入每个选项值对应的数字,从1开始依次向后为每个选项对应的数字下标。...set在插入数值时,除插入集合所给的选项外,也可以插入每个选项值对应的数字,每个选项值通过唯一的比特位来标识,也就是位图,用一个比特位来标识当前选项是否被选中。 2....一张表中往往有多个字段需要唯一性标识,一张表只能有一个主键,但一张表可以有多个唯一键,所以唯一键就可以很好的约束表中多个需要唯一性标识的字段,唯一键和主键比较相似,从功能上来讲,唯一键允许为空null,...主键不允许为空null,不过空字段是不做唯一性比较的,判断表中唯一键是否重复时,NULL肯定是不作比较的,这非常合理。...一张表中,主键只能有一个,唯一键可以有多个,所以例如学生id,电话号码,QQ号码等都可以进行唯一键约束,如果你不想让唯一键中出现NULL值,则可以在唯一键约束的基础上再多添加一个not null非空约束
,,让某字段在整个表中是唯一的 PRIMARY KEY #主键约束 FOREIGN KEY #外键约束 CHECK #检查约束 8.0才支持的,5.7还不支持 DEFAULT #默认值约束 非空约束 建表的时候给它约束...,使该字段不能有重复的值出现 同一个表可以有多个唯一约束 唯一约束可以是某个列,也可以多个列组合的唯一 唯一的字段可以为空的 在创建约束的时候,如果不给约束命名的话,那么默认和该列的名字相同。...主键约束的列不允许重复,也不允许出现空值 一个表最多有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别创建 主键约束对应表中的一列或者多列(复合主键) MySQL的主键名总是PRIMARY,自己命名了也没有用...在阿里开发规范中:不得使用外键约束与级联,一切外键概念必须在应用层解决 CHECK约束 检查模字段的值是否复合要求 MySQL5.7可以支持该约束,但是不起作用。...但是在MySQL8.0中就可以使用check约束了 DEFAULT约束 指定某个字段默认值,意思就是当该字段没有插入数据的时候,使用默认值 就是在后面加上default
领取专属 10元无门槛券
手把手带您无忧上云