MYSQL之表的约束
表中真正约束字段的是数据类型, 但是只有数据类型约束就很单一, 也需要有一些额外的约束, 从而更好的保证数据的合法性, 从业务逻辑角度保证数据的正确性. 比如有一个字段是email, 要求是唯一的.
为什么要有表的约束?
- 表的约束: 表中一定要有各种约束, 通过约束, 让我们未来插入数据库表中的数据是符合预期的.
- 约束的本质是通过技术手段, 倒逼程序员, 插入正确的数据; 反过来, 站在mysql的视角, 插入到表中的数据, 一定是符合数据约束的.
- 约束的最终目标: 保证数据的完整性和可预期性.
表的约束很多, 这里主要介绍如下几个: null/not null, default, comment, zerofill, primary key, auto_increment, unique key .
它们就体现在 desc table_name; 后的下面的字段中:
1. 空属性 NULL/NOT NULL
C语言中 NULL 是 字面值 0, 而 mysql 中NULL指的是 “不存在”. 另外, mysql中 ‘’ 指的是空字符串.
mysql 中关于 NULL 有两个值: NULL(默认的) 和 NOT NULL(不为空)
数据库默认字段基本都是字段为空, 但是实际开发时, 尽可能保证字段不为空, 因为数据为空没办法参与运算.
创建一个myclass表, 设置前两个字段不能为null:
create table if not exists myclass(-> class_room varchar(20) not null,-> class_name varchar(20) not null,-> note varchar(20)-> );
show create table myclass 可以看到对于未指定 null 的字段note, 它帮我们补充好了default null:
插入一些数据测试一下:
- 插入两条合法数据, 使 not null 的字段不为空, null的字段随意:
insert into myclass values("101", "高一一班", "实验班");
insert into myclass (class_room, class_name) values("102", "高一二班");
2. 我们如果要强行给 not null 的属性插入null, 会报错:
在提交一些网页的表单时, 有的字段是必须要填充的, 不填充则表单无法提交, 这类属性就是 not null 的.
2. 默认值 DEFAULT
默认值: 某一种数据会经常性的出现某个具体的值, 可以在一开始就指定好, 在需要真实数据的时候, 用户可以选择性的使用默认值.
简单来说, default如果设置了, 用户未来插入时, 有具体数据就用用户的, 没有就用默认的.
我们把NULL和DEFAULT的组合分为四类:
NULL | DEFAULT | 备注 |
---|---|---|
√ | NULL | |
× | NULL | |
√ | 非NULL | |
× | 非NULL |
一. 首先看表格的前两行:
create table if not exists user_info
(gender enum('男','女'),
name varchar(20) not null);
注意, 上面虽然Default都为NULL, 但是含义不同, 第一行是Default的值为NULL, 所以用户插入时忽略这一列默认插入NULL, 第二行是根本没有默认值, 这意味着如果用户在插入数据时忽略这一列会直接报错!.
对于第一种情况我们很熟悉, 它允许我们:
- 手动给值(√)
- 不给值, 默认为NULL(√)
- 手动给NULL(√)
主要来看第二种情况:
- 手动给值, 成功(√)
- 不给值, 报错为 doesn’t have a default value(×)
- 手动给NULL, 报错为 cannot be null(×)
这种情况意味着我们在插入时不可以忽略这一列, 一定要给一个初值.
二. 然后我们看表格的后两行:
NULL | DEFAULT | 备注 |
---|---|---|
√ | NULL | |
× | NULL | |
√ | 非NULL | |
× | 非NULL |
create table if not exists user_info
(gender enum('男','女') default '男',
name varchar(20) not null default'张三');
第三种情况, 也是允许我们:
- 手动给值, 可以(√)
- 不给值, 默认为default的值(√)
- 手动给NULL(√)
insert into user_info (gender, name) values ('女', "小明");
insert into user_info (name) values ("小明");
insert into user_info (gender, name) values (NULL, "小明");
和第一种情况类似, 只不过不给值时使用的是给定的默认值.
第四种情况, 仅仅不允许我们手动插入空值:
- 手动给值, 可以(√)
- 不给值, 默认为default的值(√)
- 手动给NULL, 报错(×)
从第四种情况意味着我们可以选择手动给值, 也可以用默认值, 没有像第二种情况那么强制的意思, 但是其实一般不需要同时出现.
但并不代表不能同时出现, not null 和 default 并不是想当然的: “既然有了default, 那么还要 not null 干什么, 是否多次一举?”, 不是的, 它限制了我们无法手动去插入NULL值. 看似矛盾, 实则相互补充.
3. 列描述 comment
列描述: comment 严格来说没有强制的约束意味, 它没有实际含义, 而是专门用来描述字段, 会根据表创建语句保存, 用来给程序员或DBA来进行了解
create table t12( name varchar(20) comment '姓名', age int unsigned comment "年龄"
);
desc t12 查看不到comment的信息:
通过show可以看到:
4. 零填充 zerofill
我们已经了解过了 float, decimal, char, varchar, enum, set 后面带圆括号分别是什么含义了, 但没有提过整型后面的圆括号内的数字是什么含义. 它的名字叫作显示宽度
zerofill 和 显示宽度密切相关. 比如 int(10) 代表什么意思呢? 整型不是4字节码? 这个 10 又代表什么呢?其实没有zerofill这个属性, 显示宽度是毫无意义的.
create table t14 (a int unsigned,b int(11) unsigned
);
这里我们故意把 b 设置为int (11), 但是无论是 desc 还是 show 都无法显示, 这也说明了没有 zerofill 约束的整型, 显示宽度是无意义的:
我们给 t14 的这两个 int 属性都添加上zerofill约束:
alter table t14 modify a int unsigned zerofill;
alter table t14 modify b int(11) unsigned zerofill;
再次查看, 可以看到显示宽度, 而且 int 的显示宽度默认是 10, 因为 int 表示的数据范围最大单位是十亿, 也就是10位十进制数字.
现在插入三条数据:
insert into t14 values (1, 2);
insert into t14 values (100, 200);
insert into t14 values (100000, 200000);
由于显示宽度的约束, 这意味着未来我们显示出来的表格将会是等宽的, 最终显示的长度是 max(数据本身长度, 圆括号内的长度)
.
现在我把 a 的显示宽度设置为 1, 此时表中的所有 a 都满足max(数据本身长度, 圆括号内的长度) = 数据本身的长度
再次查看:
5. 主键 PRIMARY KEY
主键定义: primary key用来唯一的约束该字段里面的数据, 不能重复, 不能为空, 一张表中最多只能有一个主键(但是一个主键可以是一列或多列 ).
- 创建主键属性:
主键所在的列通常是整数类型.
create table t15(
-> stu_id int unsigned primary key comment '学号不能为空',
-> stu_name varchar(20) not null
-> );
通过 show 可以看出它自动帮我们把 “列级约束” 抽离出来作为“表级约束”来存储, 这样也是可以的:
我们还可以发现, MYSQL还会自动把主键设置为 NOT NULL 的, 即使当时定义时没有显示说明.
desc 也可以看到 stu_id 在 Key 列有主键标识:
也可以删除主键, 追加主键(要追加主键必须当前表没有主键):
alter table t15 drop primary key; //删除当前表的主键
alter table t15 add primary key(stu_id); //追加主键
- 与主键相关的插入事项
insert 插入的一行元组中, 主键对应的字段中不能重复:
insert into t15 values (1, "zhangsan");
//插入下面这行会报错, 因为主键对应的字段中不能重复!
insert into t15 values (1, "lisi");
ERROR 1062 (23000): Duplicate entry '1' for key 't15.PRIMARY'
- 复合主键
涉及复合主键, 我们就要使用"表级约束", 方法是在创建表的时候, 在所有字段之后, 使用 primary key(主键字段列表) 来创建主键, 如果有多个字段作为主键, 可以使用复合主键.
- 列级约束适合定义简单规则;
- 表级约束适合定义复合约束,或统一写在表尾以保持清晰结构;
MySQL 最终会将所有约束都转化为表级约束存储和显示
create table t16 (
-> id int unsigned,
-> course char(10),
-> score tinyint unsigned,
-> primary key(id, course)
-> );
插入几条数据:
insert into t16 (id, course) values (1, '高等数学', 100);
insert into t16 (id, course, score) values (1, '高等数学', 100);
insert into t16 (id, course, score) values (1, '英语', 100);
insert into t16 (id, course, score) values (2, '高等数学', 90);
重复插入(1, ‘高等数学’) 会主键冲突:
insert into t16 (id, course, score) values (1, '高等数学', 80);
ERROR 1062 (23000): Duplicate entry '1-高等数学' for key 't16.PRIMARY'
6. auto_increment 自增长
auto_increment: 当对应的字段, 不给值, 会自动的被系统触发, 系统会从当前字段中已经有的最大值 +1操作, 得到一个新的不同的值. 通常和主键搭配使用, 作为逻辑主键.
自增长的特点:
- 任何一个字段要做自增长, 前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
create table t17 (
-> id int unsigned primary key auto_increment,
-> name varchar(20)
-> );
可以发现extra一栏有了auto_increment约束:
然后我们在插入时可以忽略 id , 因为 id 字段可以自增长:
insert into t17 (name) values ("a");
insert into t17 (name) values ("b");
insert into t17 (name) values ("c");
show create table 可以发现 auto_increment 字段的值为 4, 正是下一个要插入的字段的值:
也就是说我们想办法修改auto_increment 值, 就可以改变下一次插入时自增长字段的值, 有两种方法:
- 隐式修改, 手动插入一条影响 id 的值:
insert into t17 (id, name) values (500, "c");
insert into t17 (name) values ("d");
insert into t17 (name) values ("e");
2. 直接修改auto_increment字段:
//创建新表时直接约束
create table t18 (
-> id int unsigned primary key auto_increment,
-> name varchar(20)
-> )auto_increment=1000;//修改旧表的 auto_increment 值
alter table t17 auto_increment=1000;
修改之后再插入就从新的自增值继续自增了.
补充: 通过 last_insert_id 获取上次插入的 AUTO_INCREMENT 的值:
7. 唯一键
一张表中有往往有很多字段需要唯一性. 而一张表中只能有一个主键, 可以有多个唯一键, 唯一键就可以解决表中有多个字段需要唯一性约束的问题.
- 例子1
概括的来讲: 主键用于标识一个表中 “这一行是谁”, 而唯一键用于保证 “某个业务值不会重复”, 比如:
CREATE TABLE citizen (id INT AUTO_INCREMENT PRIMARY KEY, -- 系统内部主键id_card CHAR(18) UNIQUE, -- 公民身份证号:必须唯一phone VARCHAR(11) UNIQUE, -- 手机号:也要唯一name VARCHAR(50)
);
身份证号和手机号在业务逻辑上都是需要唯一的, 不是说表中只能有一个主键, 其它属性的唯一性就无法去确定了. 所以主键无法同时约束多个字段唯一, 唯一键正好补上.
- 例子2
我们知道表的主键可以由多个列构成, 那我们是否可以将多个唯一的属性合并为一个主键呢?
这就要提出主键和唯一键在技术上的区别: 主键不能为NULL, 而唯一键可以为NULL.
CREATE TABLE users (user_id INT PRIMARY KEY,login_name VARCHAR(30) UNIQUE NOT NULL,email VARCHAR(100) UNIQUE
);
- 先看向 email 字段, 不是每一个人都需要填写email, 从表的角度来说就是即使是唯一键, 也允许它为NULL, 而主键是不允许为NULL的.
- 那么我们需要一个不为 NULL 的唯一键, 就在其后面加上约束即可 .
因此我们可以发现: 主键和唯一键是互相补充的, 主键保证表中的一行元组的唯一性, 二唯一键保证本列信息在业务逻辑中不会与其它信息重复.
总结:
我们的一张表存储的各个属性列是为了去描述一个对象的. 而这些属性列中, 我们可以选择其中的 某个/些 属性去充当主键, 用于标识对象的唯一性; 但是并不排除这个对象中仍然有其它的属性的唯一性仍然需要我们去维护, 这样的属性就是唯一键.
MYSQL 为了维护属性一定是要让其符合现实逻辑的, 所以唯一键的存在就是为了让创建出来的表约束力更强, 防止上层用户的一些误操作, 它不能保证用户一定不犯错误(即使保证了唯一性, 但是输入错误), 但是能从技术层面在语义上保证这个属性一定是唯一的.
主键是逻辑结构的核心标识, UNIQUE 是业务层面补充约束.
8. foreign key 外键
首先一个数据库中的数据并不是都只存在一张表中, 而是要遵循 “规范化设计” 分成多个表来存储.
比如这里有三张表 customer goods 和 purchase:
create table customer( customer_id int unsigned primary key auto_increment, name varchar(20) not null comment "客户姓名", address varchar(20) comment "客户地址," , email varchar(30) unique comment "客户邮箱", sex enum('男','女') default '男' not null, card_id varchar(50) not null unique comment "客户身份证"
);create table goods (goods_id int unsigned NOT NULL AUTO_INCREMENT,goods_name varchar(32) NOT NULL COMMENT '商品名称',unitprice decimal(5,2) DEFAULT '0.00' COMMENT '商品价格',category varchar(12) DEFAULT NULL COMMENT '商品分类',provider varchar(12) NOT NULL COMMENT '供应商',PRIMARY KEY (goods_id)
);create table purchase (order_id int unsigned NOT NULL AUTO_INCREMENT,customer_id int unsigned DEFAULT NULL COMMENT '客户编号',goods_id int unsigned DEFAULT NULL COMMENT '商品编号',nums int unsigned DEFAULT '0' COMMENT '购买数量',PRIMARY KEY (`order_id`),FOREIGN KEY (customer_id) REFERENCES customer (customer_id),FOREIGN KEY (goods_id) REFERENCES goods (goods_id)
);
如果我们在订单purchase表中去维护customer和good的所有信息, 这样会造成:
- 数据冗余, 重复的信息被多次存储, 浪费空间.
- 不便于维护和扩展, 如果customer的信息变了, 只需更新一次 customer 表, 而不是全局修改.
外键的作用在多表中得以体现, 外键是一种约束, 目的是保证多个表之间的数据一致性, 在purchase表中主要体现在这两行:
FOREIGN KEY (customer_id) REFERENCES customer (customer_id),
FOREIGN KEY (goods_id) REFERENCES goods (goods_id)
外键的要求:
-
引用目标字段必须是 PRIMARY KEY 或 UNIQUE:
-
引用字段和被引用字段类型必须严格一致: 如果主表中被引用字段是 INT UNSIGNED, 那么从表中被引用字段类型也要是 INT UNSIGNED.
-
长度, 符号(如是否 UNSIGNED)、字符集(对于字符串)也必须相同。
主要作用:
- 主表中的主键存在时(比如customer_id, goods_id), 引用它的从表才能插入该值, 在这个例子中体现为 “不能在订单中引用不存在的顾客或商品”.
- 实现级联删除 / 更新
比如现在有customer和goods有这些数据:
所以插入 顾客1-3 和 商品1-3 的任意组合都是合法的:
insert into purchase (customer_id, goods_id, nums) values (1, 1, 2);
insert into purchase (customer_id, goods_id, nums) values (1, 3, 1);
insert into purchase (customer_id, goods_id, nums) values (1, 3, 1);
insert into purchase (customer_id, goods_id, nums) values (3, 2, 2);
但是一旦我们向从表(purchase)中插入主表中不存在的数据, 外键的约束就会触发错误:
mysql> insert into purchase (customer_id, goods_id, nums) values (4, 2, 2);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bit32mall`.`purchase`, CONSTRAINT `purchase_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`))
由于我们的purchase表中引用了张三(id为1), 所以我们试图从主表(customer)中删除从表已引用的元素, 也会由于外键的约束而报错 (除非设置 ON DELETE CASCADE 级联删除):
mysql> delete from customer where name='张三';
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`bit32mall`.`purchase`, CONSTRAINT `purchase_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`))
但是李四(id=2)始终没有在从表中被引用, 因此可以正常删除:
mysql> delete from customer where name='李四';
Query OK, 1 row affected (0.00 sec)
上面两种外键约束的情景, 都保证了mysql中对表中数据进行插入和删除时的数据一致性.
总结:
明显customer, goods, purchase 三张表在业务上是有相关性的, 但是如果在业务上没有建立约束关系(外键约束), 那么就可能出现问题(数据不一致).
而解决方案就是通过外键完成的. 建立外键的本质其实就是把相关性交给mysql去审核了, 提前告诉了 mysql 表之间的约束关系, 那么当用户插入不符合业务逻辑的数据的时候, mysql 就不允许你插入, 从而倒逼程序员在插入数据时需要做好数据的完整性约束.
相关文章:
MYSQL之表的约束
表中真正约束字段的是数据类型, 但是只有数据类型约束就很单一, 也需要有一些额外的约束, 从而更好的保证数据的合法性, 从业务逻辑角度保证数据的正确性. 比如有一个字段是email, 要求是唯一的. 为什么要有表的约束? 表的约束: 表中一定要有各种约束, 通过约束, 让我们未来…...
使用ACE-Step在本地生成AI音乐
使用ACE-Step v1-3.5B开源模型从文本提示、标签和歌词创建完整的AI生成歌曲 — 无需云服务,无需API,仅需您的GPU。 这是由ACE Studio和StepFun开发的开源音乐生成模型。 在对数据隐私和云服务依赖性日益增长的担忧时代,ACE-Step将强大的文本转音乐生成完全离线,使其成为A…...
web 自动化之 Unittest 四大组件
文章目录 一、如何开展自动化测试1、项目需求分析,了解业务需求 web 功能纳入自动化测试2、选择何种方式实现自动化测试 二、Unittest 框架三、TestCase 测试用例四、TestFixture 测试夹具 执行测试用例前的前置操作及后置操作五、TestSuite 测试套件 & TestLoa…...
2025年渗透测试面试题总结-渗透测试红队面试七(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 渗透测试红队面试七 一百八十一、Shiro漏洞类型,721原理,721利用要注意什么&am…...
Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁
设计高性能数据表的原则 数据库设计经验和技巧 单张数据表的字段不宜过多(20个),如果确实存在大量field,考虑拆成多张表或json text存储 数据表字段都是not null的,即使没有数据,最好也使用无意义的值填充,…...
day012-软件包管理专题
文章目录 1. 生成随机密码2. 软件包管理2.1 类红帽系统2.1.1 安装软件包2.1.2 查找软件包2.1.3 查看软件包内容2.1.4 查看命令或文件属于哪个软件包2.1.5 重新安装软件包2.1.6 删除软件包2.1.7 升级2.1.8 rpm安装软件包2.1.9 rpm升级软件包2.1.10 rpm检查软件包文件是否改变 3.…...
学习黑客5 分钟深入浅出理解Windows Firewall
5 分钟深入浅出理解Windows Firewall 🔥 大家好!今天我们将探索Windows防火墙——这是Windows操作系统中的核心安全组件,负责控制进出计算机的网络流量。无论你是计算机初学者,还是在TryHackMe等平台上学习网络安全的爱好者&…...
node .js 启动基于express框架的后端服务报错解决
问题: node .js 用npm start 启动基于express框架的后端服务报错如下: /c/Program Files/nodejs/npm: line 65: 26880 Segmentation fault "$NODE_EXE" "$NPM_CLI_JS" "$" 原因分析: 遇到 /c/Program F…...
feign.RequestInterceptor 简介-笔记
1. feign.RequestInterceptor 简介 Feign 是一个声明式 Web 服务客户端,用于简化 HTTP 请求的编写与管理。feign.RequestInterceptor 是 Feign 提供的一个接口,用于在请求发出之前对其进行拦截和修改。这在微服务架构中非常有用,比如在请求中…...
软考错题(四)
在程序执行过程中,高速缓存cache与主存间的地址映射由硬件自动完成 以下关于两个浮点数相加运算的叙述中,正确的是首先进行对阶,阶码小的向阶码大的对齐 认证只能阻止主动攻击不能阻止被动攻击 BGP是外部网关协议 查看端口信息࿱…...
SSRF相关
SSRF(Server Side Request Forgery,服务器端请求伪造),攻击者以服务器的身份发送一条构造好的请求给服务器所在地内网进行探测或攻击。 产生原理: 服务器端提供了能从其他服务器应用获取数据的功能,如从指定url获取网页内容、加载指定地址的图…...
供应链学习
供应链安全 供应链:整个业务系统中的节点(一般是上游节点) 乙方一般提供资源:人 软件 硬件 服务 如何寻找供应链 1.招投标信息:寻标包 例如:烟草 智能办公 2.网站本身指纹 例如: powered by xxx…...
力扣HOT100之二叉树:226. 翻转二叉树
这道题很简单,用递归来做,对于一个根节点来说,有两种情况我们不需要翻转:一是根节点为空,二是根节点为叶子节点。这很容易理解,当传入的节点不满足上面的两种情况时,我们就需要做一个翻转&#…...
如何让rabbitmq保存服务断开重连?保证高可用?
在 Spring Boot 集成 RabbitMQ 时,可以通过以下几种方式让 RabbitMQ 保存服务断开重连,以保证高可用: 配置自动重连 application.properties 配置 :在 Spring Boot 的配置文件 application.properties 中,可以设置 Ra…...
TCPIP详解 卷1协议 九 广播和本地组播(IGMP 和 MLD)
9.1——广播和本地组播(IGMP 和 MLD) IPv4可以使用4种IP地址:单播(unicast)、任播(anycast)、组播(multicast)和广播(broadcast)。 IPv6可以使用…...
全球变暖-bfs
1.不沉的就是4个方向没有海,一个大岛屿有一个不沉就行了,其余染色就好了 2.第一个bfs来统计总岛屿个数 3.第二个来统计不沉岛屿个数 4.一减就ac啦 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typede…...
DDD领域驱动开发
1. 现象: 软件设计质量最高的时候是第一次设计的那个版本(通常是因为第一次设计时,业务技术沟通最充分,从业务技术整体视角出发设计系统)。当第一个版本设计上线以后就开始各种需求变更,这常常又会打乱原有的设计。 2…...
【HarmonyOS 5】鸿蒙App Linking详解
【HarmonyOS 5】鸿蒙App Linking详解 一、前言 HarmonyOS 的 App Linking 功能为开发者提供了一个强大的工具,通过创建跨平台的深度聚合链接,实现用户在不同场景下的无缝跳转,极大地提升了用户转化率和应用的可用性。 其安全性、智能路由和…...
Android Studio 中 build、assemble、assembleDebug 和 assembleRelease 构建 aar 的区别
上一篇:Tasks中没有build选项的解决办法 概述: 在构建 aar 包时通常会在下面的选项中进行构建,但是对于如何构建,选择哪种方式构建我还是处于懵逼状态,所以我整理了一下几种构建方式的区别以及如何选择。 1. build…...
【爬虫】12306查票
城市代码: 没有加密,关键部分: 完整代码: import json import requests with open(rE:\学习文件夹(关于爬虫)\项目实战\12306\城市代码.json,r,encodingutf-8) as f:city_codef.read() city json.loads(c…...
火山RTC 7 获得远端裸数据
一、获得远端裸数据 1、获得h264数据 1)、远端编码后视频数据监测器 /*** locale zh* type callback* region 视频管理* brief 远端编码后视频数据监测器<br>* 注意:回调函数是在 SDK 内部线程(非 UI 线程)同步抛出来的&a…...
请求参数:Header 参数,Body 参数,Path 参数,Query 参数分别是什么意思,什么样的,分别通过哪个注解获取其中的信息
在API开发中(如Spring Boot),请求参数可以通过不同方式传递,对应不同的注解获取。以下是 Header参数、Body参数、Path参数、Query参数 的区别及对应的注解: Header 参数 • 含义:通过HTTP请求头&#x…...
【Web/HarmonyOS】采用ArkTS+Web组件开发网页嵌套的全屏应用
文章目录 1、简介2、效果3、在ArkTs上全屏Web3.1、创建ArkTS应用3.2、修改模块化配置(module.json5)3.3、修改系统栏控制(ArkTS代码) 4、双网页嵌套Web实现5、ArkTSWeb技术架构的演进 1、简介 在鸿蒙应用开发领域,技术…...
Leetcode (力扣)做题记录 hot100(34,215,912,121)
力扣第34题:在排序数组中查找第一个数和最后一个数 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) class Solution {public int[] searchRange(int[] nums, int target) {int left 0;int right nums.length - 1;int[…...
Babylon.js学习之路《三、创建你的第一个 3D 场景:立方体、球体与平面》
文章目录 1. 引言:从零构建一个 3D 场景1.1 目标与成果预览1.2 前置条件 2. 初始化 Babylon.js 场景2.1 创建 HTML 骨架2.2 初始化引擎与场景 3. 创建基础几何体3.1 立方体(Box)3.2 球体(Sphere)3.3 平面(P…...
Go 语言即时通讯系统开发日志-day1:从简单消息收发 Demo 起步
Go语言即时通讯系统开发日志day1,主要模拟实现的一个简单的发送消息和接受消息的小demo,因为也才刚学习go语言的语法,对go的json、net/http库了解不多,所以了解了一下go语言的encoding/json库和net/http库,以及websock…...
AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
作者:Yifei Su, Dong An, Kehan Chen, Weichen Yu, Baiyang Ning, Yonggen Ling, Yan Huang, Liang Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所模式识别与智能系统实验室,穆罕默德本扎耶德人工智能大学࿰…...
中科院无人机导航物流配送的智能变革!LogisticsVLN:基于无人机视觉语言导航的低空终端配送系统
作者:Xinyuan Zhang, Yonglin Tian, Fei Lin, Yue Liu, Jing Ma, Kornlia Sra Szatmry, Fei-Yue Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所多模态人工智能系统国家重点实验室,澳门科技大学创新工程学院工程科学系…...
IP协议、以太网包头及UNIX域套接字
IP协议、以太网包头及UNIX域套接字 IP包头结构 IP协议是互联网的核心协议之一,其包头包含了丰富的信息来控制数据包的传输。让我们详细解析IPv4包头结构: 4位版本号(version):标识IP协议版本,IPv4值为4 4位首部长度(header len…...
普林斯顿数学三剑客读本分析。
这几天看了普斯林顿数学三剑客,主要看了微积分、概率论前半部分,数学分析看了目录,大体略读了一下。怎么说呢,整体上来看,是很不错的,适合平常性阅读,配套结合国内教材习题来深入还是很不错的。…...
Matlab 模糊pid的液压舵机伺服系统
1、内容简介 Matlab 235-模糊pid的液压舵机伺服系统 可以交流、咨询、答疑 2、内容说明 略 舵机是轮船,客机等机器控制系统的重要组成部分,是客机,战斗机等飞行器操作系统的关键部件,也是一种超高的精度的位置伺服系统ÿ…...
Linux基础命令之目录管理——了解各种操作文件目录的命令,万字教学,超详细!!!(1)
文章目录 前言1、Linux文件系统1.1 核心特点1.2 重要目录结构1.3 文件类型1.4 文件和目录的命名规则1.5 文件与目录的定位方式 2、查看目录或文件的详细信息(ls)2.1 基本语法2.2 常用操作2.3 高级用法 3、切换目录(cd)3.1 常用操作…...
中国黄土高原中部XF剖面磁化率和粒度数据
时间分辨率:1000年 < x空间分辨率为:空共享方式:申请获取数据大小;35.75 KB数据时间范围:743-0 ka元数据更新时间:2023-08-15 数据集摘要 该数据集包括中国黄土高原中部XF剖面磁化率和粒度数据。将所有…...
tabs切换#
1、html <el-tabs v-model"tabValue" tab-change"handleTabClick"><el-tab-pane label"集群" name"1"></el-tab-pane><el-tab-pane label"节点" name"2"></el-tab-pane></el-ta…...
免费Office图片音频高效提取利器
软件介绍 今天要给大家介绍一款非常好用的Office文档图片及音频提取工具,它不仅好用,而且完全免费,没有任何广告。 软件概况 这款名为Office File Picture Extractor(PPT图片提取)的软件,大小仅有4MB。打…...
迁移 Visual Studio Code 设置和扩展到 VSCodium
本文同步发布在个人博客 迁移 Visual Studio Code 设置和扩展到 VSCodium - 萑澈的寒舍https://hs.cnies.org/archives/vscodium-migrateVisual Studio Code(以下简称 VS Code)无疑是当下最常用的代码编辑器。尽管微软的 VS Code 源代码采用 MIT 协议开…...
1.7 方向导数
(底层逻辑演进脉络)从"单车道"到"全路网"的导数进化史: 一、偏导数奠基(1.6核心) 诞生背景:多元函数分析需求 当变量间存在耦合关系时(如房价面积单价装修成本)…...
深入理解目标检测中的关键指标及其计算方法
深入理解目标检测中的关键指标及其计算方法 在目标检测领域,评估模型性能时,我们通常会关注几个关键指标,这些指标帮助我们量化模型的准确性和有效性。本文将详细介绍这些常见指标及其计算方法,帮助你更好地理解和评估目标检测模…...
Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
前言: 因为想到有些环境可能没法使用外网的大模型,所以可能需要内网部署,看了一下ollama适合小型的部署,所以就尝试了一下,觉得docker稍微简单一点,就做这个教程的,本文中重要的内容都会给下载…...
【Redis实战篇】分布式锁-Redisson
1. 分布式锁-redisson功能介绍 基于setnx实现的分布式锁存在下面的问题: 重入问题: 重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都…...
构造二叉树
一、由中序和后序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* …...
vue3: pdf.js 3.4.120 using javascript
npm install pdfjs-dist3.4.120 项目结构: pdfjsViewer.vue <template><div><div v-if"loading" class"flex justify-center items-center py-8"><div class"animate-spin rounded-full h-12 w-12 border-b-2 borde…...
编译原理AST以Babel为例进行解读、Webpack中自定义loader与plugin
AST树详解 编译原理 主要研究如何将高级编程语言的源代码转换为机器能理解的目标代码(通常是二进制代码或中间代码)。编译器的底层实现通常包含多个阶段,包括词法分析、语法分析、语义分析和代码生成。 一、AST的核心概念与作用 AST&#…...
牛客周赛 Round 92
目录 A-小红的签到题 代码 B-小红的模拟 代码 C-小红的方神题 代码 D-小红的数学题 代码 无注释版 有注释版 E-小红的ds题 代码 无注释版 有注释版 A-小红的签到题 代码 #include<bits/stdc.h> using namespace std; int main(){int n;cin>>n;cha…...
面试题:C++虚函数可以是内联函数吗?
目录 1.引言 2.示例 3.总结 1.引言 为什么C的虚函数和内联函数这两个看似矛盾的特性能否共存?这个问题实际上触及了C编译期优化与运行时多态性之间的微妙平衡。我发现这个问题不仅是面试中的常见陷阱,更是理解C深层机制很好的一个点。 虚函数可以被声…...
蚁群算法赋能生鲜配送:MATLAB 实现多约束路径优化
在生鲜农产品配送中,如何平衡运输效率与成本控制始终是行业难题。本文聚焦多目标路径优化,通过 MATLAB 实现蚁群算法,解决包含载重限制、时间窗约束、冷藏货损成本的复杂配送问题。代码完整复现了从数据生成到路径优化的全流程,助…...
前苹果首席设计官回顾了其在苹果的设计生涯、公司文化、标志性产品的背后故事
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》
手把手教你用 Kubernetes 部署高可用 WordPress 博客 本实验通过 Kubernetes 容器编排平台,完整部署了一个高可用的 WordPress 网站架构,包含 MariaDB 数据库、WordPress 应用和 Nginx 反向代理三大核心组件。实验涵盖了从基础环境准备到最终服务暴露的…...
文件上传总结
攻击与绕过方式 一、条件竞争 攻击原理:在上传文件的同时利用代码逻辑中的时序问题(如 unlink() 删除操作)触发条件竞争,从而实现上传恶意文件并绕过限制。 示例测试源码: 以下为测试文件上传功能的 PHP 源码ÿ…...
在文档里如何引用在线SVG甘特图
在文档里如何引用在线SVG甘特图 介绍 本文将详细介绍如何快速创建一个功能强大的在线甘特图,并将其嵌入到其他文档(如 Notion、Wiki、Qiita、GitHub、Obsidian、Email 等)中。只要目标工具支持引用网络图片,你就可以轻松实现这一…...