MySQL-数据库约束

news2024/11/18 11:19:12

1.约束类型

类型说明
NOT NULL非空约束

指定非空约束的列不能存储NULL值

DEFAULT默认约束当没有给列赋值时使用的默认值
UNIQUE唯一约束指定唯一约束的列每行数据必须有唯一的值
PRIMARY KEY主键约束NOT NULL和UNIQUE的结合,可以指定一个列霍多个列,有助于防止数据重复和提高数据的查询性能
FOREIGN KEY外键约束外键约束是一种关系约束,用于定义两个表之间的关联关系,可以确保数据的完整性和一致性
CHECK约束用于限制列或数据在数据库表中的值,确保数据的准确性和可靠性

2.NOT NULL非空约束

定义表时某列不允许为NULL时,可以为列添加非空约束

⽐如创建⼀个学⽣表,学⽣名为NULL时,这条记录是不完整的
drop table if exists student;
create table student(
 id bigint,
 name varchar(20)
);

# 插⼊数据
insert into student values (1, null);

# 查询
select * from student;
+------+------+
| id | name |
+------+------+
| 1 | NULL | # 班级名为NULL,没有意义
+------+------+
1 row in set (0.00 sec)

此时需要约束学生名的列不能为NULL

drop table if exists student;
# 为所有列添加⾮空约束
create table student (
 id bigint,
 name varchar(20) NOT NULL
);

# 由于name列有⾮空约束,插⼊NULL值时报错
insert into student values (1, null);
ERROR 1048 (23000): Column 'name' cannot be null

# 正常值可以成功插⼊
insert into student values (1, '张三');
Query OK, 1 row affected (0.00 sec)
select * from student;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
+------+--------+
1 row in set (0.00 sec)
查看表结构,NULL列为NO表⽰值不允许为NULL,YES表⽰值可以为NULL
desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | bigint | YES | | NULL | |
| name | varchar(10) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

3.DEFALUT默认值约束

DEFAULT 约束⽤于向列中插⼊默认值,如果没有为列设置值,那么会将默认值设置到该列
重构学⽣表,新增年龄列
drop table student;
# 创建学⽣表,加⼊年龄列
create table student (
 id bigint,
 name varchar(20) not null,
 age int
);
插⼊⼀条记录,没有设置默认约束时,不指定年龄的值时列为NULL
insert into student(id, name) values (1, '张三');

select * from student;
+------+--------+------+
| id | name | age |
+------+--------+------+
| 1 | 张三 | NULL | # 年龄值为NULL
+------+--------+------+
1 row in set (0.00 sec)
重构学⽣表,为年龄的列加⼊默认约束
drop table student;

# 为年龄列加⼊默认约束

create table student (
 id bigint,
 name varchar(20) not null,
 age int DEFAULT 18
);
插⼊⼀条记录,不指定年龄的值时列使⽤了默认值
select * from student;
+------+--------+------+
| id | name | age |
+------+--------+------+
| 1 | 张三 | 18 |
+------+--------+------+
1 row in set (0.00 sec)
查看表结构,年龄列的默认值为18
desc student;
+-------+-------------+------+-----+---------+-------+
| Field |         Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
|    id |      bigint |   YES |     |    NULL |       |
|  name | varchar(20) |    NO |     |    NULL |       |
|   age |         int |   YES |     |      18 |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

当手动明确值年龄列为NULL时列值为NULL

insert into student(id, name, age) values (2, '李四', NULL);
Query OK, 1 row affected (0.00 sec)
select * from student;
+------+--------+------+
| id | name | age |
+------+--------+------+
| 1 |  张三 |   18 |
| 2 |  李四 | NULL |
+------+--------+------+
2 rows in set (0.00 sec)

4.UNIQUE唯一约束

指定了唯⼀约束的列,该列的值在所有记录中不能重复,⽐如⼀个⼈的⾝份证号,学⽣的学号等

重构学生表,新增学号列

drop table student;
# 学号列设置唯⼀约束
create table student (
 id bigint,
 name varchar(20) not null,
 age int DEFAULT 18,
 sno varchar(10)
);

不设置唯⼀约束时,学号可以重复

insert into student(id, name, sno) values (1, '张三', '100001');
Query OK, 1 row affected (0.00 sec)

insert into student(id, name, sno) values (2, '李四', '100001');
Query OK, 1 row affected (0.00 sec)

select * from student;
+------+--------+------+--------+
| id | name | age | sno |
+------+--------+------+--------+
| 1 | 张三 | 18 | 100001 |
| 2 | 李四 | 18 | 100001 |
+------+--------+------+--------+
2 rows in set (0.00 sec)
重构学⽣表,为学号列设置唯⼀约束
drop table student;
create table student (
 id bigint,
 name varchar(20) not null,
 age int DEFAULT 18,
 sno varchar(10) UNIQUE # 唯⼀约束
);
插⼊重复的学号时报错,唯⼀约束⽣效
insert into student(id, name, sno) values (1, '张三', '100001');
Query OK, 1 row affected (0.01 sec)

insert into student(id, name, sno) values (2, '李四', '100001');
ERROR 1062 (23000): Duplicate entry '100001' for key 'student.sno'

select * from student;
+------+--------+------+--------+
| id | name | age | sno |
+------+--------+------+--------+
| 1 | 张三 | 18 | 100001 |
+------+--------+------+--------+
1 row in set (0.00 sec)
查看表结构,Key列显⽰UNI表⽰唯⼀约束
desc student;
+-------+-------------+------+-----+---------+-------+
| Field |        Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
|    id |      bigint |  YES |     |    NULL |       |
|  name | varchar(20) |   NO |     |    NULL |       |
|   age |         int |  YES |     |      18 |       |
|   sno | varchar(10) |  YES | UNI |    NULL |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

5.PRIMARY KEY主键约束

主键约束唯⼀标识数据库表中的每条记录。
主键必须包含唯⼀的值,且不能包含 NULL 值。
每个表只能有⼀个主键,可以由单个列或多个列组成。
通常为每张表都指定⼀个主键,主键列建议使⽤BIGINT类型

 重构学⽣表,为ID列添加⾮空和唯⼀约束

drop table student;
create table student (
 id bigint not null unique,
 name varchar(20) not null,
 age int DEFAULT 18,
 sno varchar(10) UNIQUE
);
查看表结构,添加了⾮空和唯⼀约束之后Key列显⽰PRI表⽰主键
desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
|   id |    bigint |   NO | PRI |  NULL |     | # 主键
|  name | varchar(20) |   NO |    |  NULL |     |
|   age|      int |  YES |    |  18 |      |
|   sno| varchar(10) |   YES | UNI |  NULL |     |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
当Id列的重复时会发⽣主键冲突
insert into student(id, name, sno) values (1, '张三', '100001');
Query OK, 1 row affected (0.01 sec)

insert into student(id, name, sno) values (1, '李四', '100001');
ERROR 1062 (23000): Duplicate entry '1' for key 'student.id'
通常把主键列设置为⾃动增⻓,让数据库维护主键值
drop table student;

# 重构学⽣表
create table student (
 id bigint PRIMARY KEY auto_increment, # 设置⾃增主键
 name varchar(20) not null,
 age int DEFAULT 18,
 sno varchar(10) UNIQUE
);
插⼊数据时不设置主键列的值
# 主键列的值为NULL
insert into student(id, name, sno) values (NULL, '张三', '100001');
Query OK, 1 row affected (0.00 sec)

# 不指定主键
insert into student(name, sno) values ('李四', '100002');
Query OK, 1 row affected (0.01 sec)

# 主键列的值⾃动⽣成
select * from student;
+----+--------+------+--------+
| id | name | age | sno |
+----+--------+------+--------+
| 1 | 张三 | 18 | 100001 |
| 2 | 李四 | 18 | 100002 |
+----+--------+------+--------+
2 rows in set (0.00 sec)
查看表结构,Extra列显⽰auto_increment 表⽰⾃增
desc student;
+-------+-------------+------+-----+---------+----------------+
| Field |     Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
|   id |    bigint | NO | PRI |   NULL | auto_increment |
|  name | varchar(20) | NO |   |   NULL |          |
|   age |     int | YES |   |    18 |         |
|   sno | varchar(10) | YES | UNI |  NULL |         |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
如果某条记录写⼊失败,新⽣成的主键值将会作废
# 由于学号重复,产⽣了唯⼀冲突,导致插⼊失败,ID为3的主键值作废
insert into student(name, sno) values ('王五', '100002');
ERROR 1062 (23000): Duplicate entry '100002' for key 'student.sno'

# 修改学号后成功插⼊数据
insert into student(name, sno) values ('王五', '100003');
Query OK, 1 row affected (0.00 sec)

# 查询后发现新记录ID列的值为4
select * from student;
+----+--------+------+--------+
| id | name | age | sno |
+----+--------+------+--------+
| 1 | 张三 | 18 | 100001 |
| 2 | 王五 | 18 | 100002 |
| 4 | 王五 | 18 | 100003 | # 新插⼊的记录
+----+--------+------+--------+
3 rows in set (0.00 sec)
主键值可以不连续
# ⼿动指定⼀个值
insert into student(id, name, sno) values (100, '赵六', '100004');
Query OK, 1 row affected (0.01 sec)

select * from student;
+-----+--------+------+--------+
| id | name | age | sno |
+-----+--------+------+--------+
| 1 | 张三 | 18 | 100001 |
| 2 | 王五 | 18 | 100002 |
| 4 | 王五 | 18 | 100003 |
| 100 | 赵六 | 18 | 100004 |
+-----+--------+------+--------+
4 rows in set (0.00 sec)

# 下⼀次⾃增从主键的最⼤值开始
insert into student(name, sno) values ('钱七', '100005');
Query OK, 1 row affected (0.01 sec)

select * from student;
+-----+--------+------+--------+
| id | name | age | sno |
+-----+--------+------+--------+
| 1 | 张三 | 18 | 100001 |
| 2 | 王五 | 18 | 100002 |
| 4 | 王五 | 18 | 100003 |
| 100 | 赵六 | 18 | 100004 |
| 101 | 钱七 | 18 | 100005 | # ID列的值是101
+-----+--------+------+--------+
5 rows in set (0.00 sec)
主键或唯⼀键冲突时的更新操作,插⼊否则更新
# 语法
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...

# 插⼊ID为100,学号为100100的学⽣记录时,报主键冲突
insert into student(id, name, sno) values (100, '赵六', '100100');
ERROR 1062 (23000): Duplicate entry '100' for key 'student.PRIMARY'

# 可以使⽤以上语法,如果插⼊时有冲突则更新当前列的值
insert into student(id, name, sno) values (100, '赵六', '100100')
 -> ON DUPLICATE KEY UPDATE name = '赵六', sno = '100100';
Query OK, 2 rows affected (0.01 sec) 

# 两⾏受影响,表⽰删除了原来的记录,⼜新写⼊了⼀条记录
# 与update student set name = '赵六', sno = '100100' where id = 100; 等效

select * from student;
+-----+--------+------+--------+
| id | name | age | sno |
+-----+--------+------+--------+
| 1 | 张三 | 18 | 100001 |
| 2 | 王五 | 18 | 100002 |
| 4 | 王五 | 18 | 100003 |
| 100 | 赵六 | 18 | 100100 | # 学号已修改
| 101 | 钱七 | 18 | 100005 |
+-----+--------+------+--------+
5 rows in set (0.00 sec)
替换,如果存在冲突则替换,不存在冲突则插⼊
# 语法
REPLACE [INTO] table_name
 [(column [, column] ...)]
VALUES
 (value_list) [, (value_list)] ...
value_list: value, [, value] ...

# 写⼊或更新Id为101的记录
REPLACE into student(id, name, sno) values (101, '钱七', '100101');
Query OK, 2 rows affected (0.01 sec) # 受影响两⾏

# 原数据已更新
select * from student;
+-----+--------+------+--------+
| id | name | age | sno |
+-----+--------+------+--------+
| 1 | 张三 | 18 | 100001 |
| 2 | 王五 | 18 | 100002 |
| 4 | 王五 | 18 | 100003 |
| 100 | 赵六 | 18 | 100100 |
| 101 | 钱七 | 18 | 100101 |
+-----+--------+------+--------+
5 rows in set (0.00 sec)

# 写⼊⼀条新数据
REPLACE into student(id, name, sno) values (102, '吴⼋', '100102');
Query OK, 1 row affected (0.01 sec) # 受影响⼀⾏

# 成功写⼊
select * from student;
+-----+--------+------+--------+
| id | name | age | sno |
+-----+--------+------+--------+
| 1 | 张三 | 18 | 100001 |
| 2 | 王五 | 18 | 100002 |
| 4 | 王五 | 18 | 100003 |
| 100 | 赵六 | 18 | 100100 |
| 101 | 钱七 | 18 | 100101 |
| 102 | 吴⼋ | 18 | 100102 |
+-----+--------+------+--------+
6 rows in set (0.00 sec)

表中不能有多个主键

drop table student;
# 重构学⽣表
create table student (
 id bigint PRIMARY KEY auto_increment, # 定义主键
 name varchar(20) PRIMARY KEY # 定义主键
);
ERROR 1068 (42000): Multiple primary key defined # 报错
复合主键:由多个列共同组成的主键,主键是否冲突以多个列的组成进⾏判定
drop table student;
# 重构学⽣表
create table student (
 id bigint,
 name varchar(20),
 PRIMARY KEY (id, name) # 指定复合主键
);

# 插⼊数据
insert into student(id, name) values (1, '张三');
Query OK, 1 row affected (0.01 sec)

# 重复插⼊主键冲突,此时主键值由id和name两个列共同决定
insert into student(id, name) values (1, '张三');
ERROR 1062 (23000): Duplicate entry '1-张三' for key 'student.PRIMARY'

# 修改id值插⼊成功
insert into student(id, name) values (2, '张三');
Query OK, 1 row affected (0.00 sec)

select * from student;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 张三 |
+----+--------+
2 rows in set (0.00 sec)

6.FOREIGN KEY外键约束

外键⽤于定义主表和从表之间的关系
外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束
当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为null。

 

 创建班级表(主表),并初始化数据

drop table if exists class;
# 建表
create table class (
 id bigint primary key auto_increment,
 name varchar(20) not null
);

# 初始化数据
insert into class (name) values ('java01'), ('java02'), ('java03'), ('C++01'), 
('C++02');
Records: 5 Duplicates: 0 Warnings: 0

select * from class;
+----+--------+
| id | name |
+----+--------+
| 1 | java01 |
| 2 | java02 |
| 3 | java03 |
| 4 | C++01 |
| 5 | C++02 |
+----+--------+
5 rows in set (0.00 sec)

重构学生表(从表),加入外键约束

# 语法
foreign key (id) references class(id)

drop table if exists student;

# 重构表
create table student(
 id bigint PRIMARY KEY auto_increment, 
 name varchar(20) not null,
 age int DEFAULT 18,
 class_id bigint,
 foreign key (class_id) references class(id) # 创建外键约束
);
查看表结构,Key列的值为MUL表⽰外键约束的列
desc student;
+----------+-------------+------+-----+---------+----------------+
|    Field |        Type | Null | Key | Default |          Extra |
+----------+-------------+------+-----+---------+----------------+
|       id |      bigint |   NO | PRI |    NULL | auto_increment |
|     name | varchar(20) |   NO |     |    NULL |                |
|      age |         int |  YES |     |      18 |                |
| class_id |      bigint |  YES | MUL |    NULL |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
正常插⼊数据
# 班级编号在主表中存在
insert into student(name, class_id) values ('张三', 1), ('李四', 2);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

# 插⼊成功
select * from student;
+----+--------+------+----------+
| id | name | age | class_id |
+----+--------+------+----------+
|  1 | 张三 |  18 |        1 |
|  2 | 李四 |  18 |        2 |
+----+--------+------+----------+
2 rows in set (0.00 sec)
插⼊⼀个班级号为100的学⽣,由于主表中没有这个班级,插⼊失败
# 班级编号在主表中不存在,提⽰外键约束限制导致插⼊失败
insert into student(name, class_id) values ('王五', 100);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint
fails (`java01`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY 
(`class_id`) REFERENCES `class` (`id`))
插⼊班级Id为NULL的记录,可以成功,表⽰当前学⽣还没有分配置班级
# 班级为NULL
insert into student(name, class_id) values ('王五', NULL);
Query OK, 1 row affected (0.00 sec)
select * from student;
+----+--------+------+----------+
| id | name | age | class_id |
+----+--------+------+----------+
|  1 | 张三 |  18 |        1 |
|  2 | 李四 |  18 |        2 |
|  4 | 王五 |  18 |     NULL |
+----+--------+------+----------+
3 rows in set (0.00 sec)
删除主表某条记录时,从表中不能有对该记录的引⽤
# 删除从表中没有引⽤的记录,可以成功
delete from class where name = 'java03';
Query OK, 1 row affected (0.00 sec)

select * from class;
+----+--------+
| id | name |
+----+--------+
| 1 | java01 |
| 2 | java02 |
| 4 | C++01 |
| 5 | C++02 |
+----+--------+
4 rows in set (0.00 sec)

# 删除从表中引⽤的记录,失败
delete from class where name = 'java01';
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key 
constraint fails (`java01`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY 
(`class_id`) REFERENCES `class` (`id`))
删除主表时要先删除从表
# 从表存在是不能删除主表
drop table class;
ERROR 3730 (HY000): Cannot drop table 'class' referenced by a foreign key 
constraint 'student_ibfk_1' on table 'student'.

# 删除从表
drop table student;
Query OK, 0 rows affected (0.02 sec)

# 再删除主表,成功
drop table class;
Query OK, 0 rows affected (0.01 sec)

7.CHECK约束

可以应⽤于⼀个或多个列,⽤于限制列中可接受的数据值,从⽽确保数据的完整性和准确性。
在8.0.16开始全⾯⽀持CHECK约束,之前的版本会忽略CHECK的定义
重构学⽣表,有以下要求,年龄不能⼩于16岁,性别只能是男或⼥
drop table if exists student;

# 加⼊CHECK约束
create table student(
 id bigint PRIMARY KEY auto_increment, # 设置⾃增主键
 name varchar(20) not null,
 age int DEFAULT 18,
 gender char(1),
 check (age >= 16),
 check (gender = '男' or gender = '⼥')
);

# 正常插⼊数据
mysql> insert into student(name, age, gender) values ('张三', 17, '男'), ('李
四', 19, '⼥');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from student;
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 1 | 张三 | 17 | 男 |
| 2 | 李四 | 19 | ⼥ |
+----+--------+------+--------+
2 rows in set (0.00 sec)

# 插⼊年龄⼩于16岁的记录,失败
mysql> insert into student(name, age, gender) values ('张三', 15, '男');
ERROR 3819 (HY000): Check constraint 'student_chk_1' is violated.

# 插⼊性别的值不是男或⼥的记录,失败
mysql> insert into student(name, age, gender) values ('张三', 17, '1');
ERROR 3819 (HY000): Check constraint 'student_chk_2' is violated.
创建新表,c1的值不能为0,c2的值必须⼤于0,c3的值不⼩于c2
# 列与列之间也可以⽐较,需要在单独⼀⾏中定义
create table t_check (
 c1 int check(c1 <> 0),
 c2 int check(c2 > 0),
 c3 int,
 check(c3 >= c2)
);

# 插⼊正常数据
mysql> insert into t_check values (-1, 3, 10);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t_check;
+------+------+------+
| c1 | c2 | c3 |
+------+------+------+
| -1 | 3 | 10 |
+------+------+------+
1 row in set (0.00 sec)

# c1 = 0时,失败
mysql> insert into t_check values (0, 5, 6);
ERROR 3819 (HY000): Check constraint 't_check_chk_1' is violated.

# c2 <= 0时,失败
mysql> insert into t_check values (2, -10, 10);
ERROR 3819 (HY000): Check constraint 't_check_chk_2' is violated.

# c3 < c2时,失败
mysql> insert into t_check values (2, 10, 9);
ERROR 3819 (HY000): Check constraint 't_check_chk_3' is violated.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2175425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt6 使用QPSQL

qt6 自带pg数据库驱动&#xff1a; pro文件加个说明&#xff1a; 引用位置添加&#xff08;按需添加&#xff0c;这里我就大致加一下&#xff09;&#xff1a; test code: 理想情况当然是要用pool,这里只是演示调用而已 QSqlError DbTool::testConnection(const QString &…

LSTM预测未来30天销售额

加入深度实战社区:www.zzgcz.com&#xff0c;免费学习所有深度学习实战项目。 1. 项目简介 本项目旨在利用深度学习中的长短期记忆网络&#xff08;LSTM&#xff09;来预测未来30天的销售额。LSTM模型能够处理时序数据中的长期依赖问题&#xff0c;因此在销售额预测这类涉及时…

19款奔驰E300升级新款触摸屏人机交互系统

《19 款奔驰 E300 的科技焕新之旅》 在汽车科技日新月异的时代&#xff0c;19 款奔驰 E300 的车主们为了追求更卓越的驾驶体验&#xff0c;纷纷选择对爱车进行升级改装&#xff0c;其中新款触摸屏人机交互系统的改装成为了热门之选。 19 款奔驰 E300 作为一款经典车型&#x…

Vue和axios零基础学习

Vue的配置与项目创建 在这之前要先安装nodejs 安装脚手架 官网 Home | Vue CLI (vuejs.org) 先运行&#xff0c;切换成淘宝镜像源&#xff0c;安装速度更快 npm config set registry http://registry.npm.taobao.org 创建项目 用编译器打开一个空文件&#xff0c;在终端输入…

DMA的原理

一、介绍 DMA&#xff08;Direct Memory Access&#xff09;是一种允许设备直接与内存进行数据交换的技术&#xff0c;无需‌CPU干预。DMA的主要功能是提供在‌外设和存储器之间或者存储器和存储器之间的高速数据传输。比如使用ADC进行数据采集&#xff0c;可以直接将数据存入…

【STM32】江科大STM32笔记汇总(已完结)

STM32江科大笔记汇总 STM32学习笔记课程简介(01)STM32简介(02)软件安装(03)新建工程(04)GPIO输出(05)LED闪烁& LED流水灯& 蜂鸣器(06)GPIO输入(07)按键控制LED 光敏传感器控制蜂鸣器(08)OLED调试工具(09)OLED显示屏(10)EXTI外部中断(11)对射式红外传感器计次 旋转编码器…

GAMES101(21~22节,动画和仿真)

Animation 关键帧 动画和几何&#xff08;曲线&#xff09;相关 物理模拟/仿真 牛顿第二定律&#xff1a;F ma 需要清楚网格间相互作用力&#xff0c;也需要把物理仿真和渲染分为两部来看&#xff0c;例如布料模拟&#xff0c;流体模拟 mass spring system质点弹簧系统 …

Nest.js实现一个简单的聊天室

本文将介绍如何使用 Nest.js 和 Uni-app 实现一个简单的实时聊天应用。后端使用 nestjs/websockets 和 socket.io&#xff0c;前端使用 uni-app 并集成 socket.io-client。这个项目允许多个用户同时加入聊天并实时交换消息。 效果图&#xff1a; 一、准备工作 安装 Node.js 和…

数据结构与算法——Java实现 24.中缀表达式转后缀

目录 中缀表达式转后缀表达式 引言 思路 代码 正因为我有能力跨越&#xff0c;考验才会降临 —— 24.9.28 中缀表达式转后缀表达式 引言 Java中的编译器会将我们编写代码中的中缀表达式转化为后缀表达式&#xff0c;然后编译好输出程序 思路 遍历中缀表达式&#xff0c;如果遇…

电脑学习通看不到课程解决办法

电脑学习通看不到课程解决办法 查看学习通时发现没有课程 解决方法1: 更改单位 具体见:超星学习通关于PC版无法查看课程问题解决 解决方法二:添加应用 添加应用 点击账号管理 点击应用管理 添加应用、添加首页这个应用 添加完成后查看首页就能看到课程了 然后就OK啦、就可…

[JavaEE] HTTP/HTTPS

目录 一、HTTP 1.1 HTTP是什么 1.2 HTTP发展史 1.3 HTTP工作过程 1.3.1 抓包工具的原理 1.4 HTTP请求格式 1.4.1认识URL 1.5 HTTP响应格式 1.6 认识HTTP"方法"(method) 1.6.1 GET方法 1.6.2 POST方法 1.6.3 其他方法 1.7 GET 与 POST 的区别 1.8 认识…

Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!

&#x1f9f8;本篇博客重在讲解Centos安装docker&#xff0c;经博主多次在不同服务器上测试&#xff0c;极其的稳定&#xff0c;尤其是阿里的服务器&#xff0c;一路复制命令畅通无阻 &#x1f4dc;后续会退出ububtu安装docker教程&#xff0c;敬请期待 &#x1f4dc;作者首页&…

某客户Oracle RAC无法启动故障快速解决

某日&#xff0c;9:50左右接到好友协助需求&#xff0c;某个客户Oracle RAC无法启动&#xff0c;并发过来一个报错截图&#xff0c;如下&#xff1a; 和客户维护人员对接后&#xff0c;远程登录服务端进行故障分析。 查看hosts信息&#xff0c;首先进行心跳测试&#xff0c;测…

Java爬虫:获取SKU详细信息的艺术

在电子商务的世界里&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;是每个商品的唯一标识符&#xff0c;它包含了商品的详细信息&#xff0c;如尺寸、颜色、价格等。对于商家和开发者来说&#xff0c;获取商品的SKU详细信息对于库存管理、订单…

Spring Boot 整合 Keycloak

1、概览 本文将带你了解如何设置 Keycloak 服务器&#xff0c;以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。 2、Keycloak 是什么&#xff1f; Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单…

秦巴山区SHP格式矢量范围

‌秦巴山区的shp范围包括河南、湖北、重庆、四川、陕西、甘肃六省市的80个县(市、区)。‌这一区域不仅地理范围广泛&#xff0c;而且生态多样性丰富&#xff0c;是国家重要的生物多样性和水源涵养生态功能区。秦巴山区的地貌类型以山地丘陵为主&#xff0c;间有汉中、安康、商丹…

Centos8.5.2111(1)之本地yum源搭建和docker部署与网络配置

由于后边可能要启动多个服务&#xff0c;避免服务之间相互干扰&#xff0c;本课程建议每个服务独立部署到一台主机上&#xff0c;这样做会导致资源占用过多&#xff0c;可能会影响系统的运行。服务器部署一般不采用GUI图形界面部署&#xff0c;而是采用命令行方式部署&#xff…

lDE 使用技巧与插件推荐(含案例说明)

在使用集成开发环境&#xff08;IDE&#xff09;进行编程时&#xff0c;掌握一些技巧和使用高效的插件可以显著提高开发效率。以下是一些通用的IDE使用技巧和插件推荐&#xff0c;适用于多种流行的IDE&#xff0c;如IntelliJ IDEA、Visual Studio Code、PyCharm等。每个技巧和插…

IEEE GRSL投稿历程分享

投稿期刊&#xff1a;IEEE geoscience and remote sensing 本人为本科生&#xff0c;在投这本期刊时已经经历了三次拒稿&#xff08;两次RS&#xff0c;一次GRSL&#xff09;&#xff0c;被RS拒稿意料之中&#xff0c;因为工作量并不是特别大&#xff0c;所以写得比较短&#…

【RocketMQ】RocketMQ快速入门

&#x1f3af; 导读&#xff1a;该文档介绍了Apache RocketMQ消息队列的基础应用&#xff0c;包括消息发送与接收的基本流程。首先通过创建生产者实例&#xff0c;并指定名称服务器地址&#xff0c;启动后即可发送消息至指定主题。然后创建消费者实例订阅相应主题&#xff0c;并…