MySQL【三】操作数据库基础

news2024/12/23 4:41:41

库、表、记录的概念

库(Database):库是一个容器,用于存储表和其他对象(如视图、存储过程等)

表(Table):表是一个由列和行组成的矩阵,其中每列都定义了表中的一种数据类型,每行则表示表中的一个记录。

记录(Record):记录是表中的一行数据。

------------------------------------------------------------

修改数据库表中的字段

【1】添加新的字段

alter table 表名 add 新字段名(列名) 数据类型;
alter table person add teacher varchar(255);

image-20240128213426147

【2】修改字段的数据类型

alter table 表名 modify 字段名(列名) 新数据类型;
alter table person modify teacher varchar(200);

image-20240128213914833

【3】修改字段名(列名)

alter table 表名 change 旧字段名 新字段名 数据类型;
alter table person change teacher teacher_name varchar(150);

image-20240128214506451

【4】删除字段

alter table 表名 drop 字段名;
alter table person drop teacher_name;

image-20240128214626542

【5】将新列中添加新

update person set teacher = '某某老师' where teacher is null;

image-20240128215654880

update person set teacher = case 
	when sex = '男' then '赵老师'
	when sex = '女' then '小猴老师'
	else teacher
end;

image-20240128215844608

【6】插入新的字段

insert into 表名 (1,2,3, ...) values (1,2,3, ...);
insert into person (name, age, heigh, sex, teacher) values ('john', 30, 180, '男', '赵老师');

image-20240128220828931

查看数据库的信息

  • show用于显示数据库服务器状态或元数据信息。
  • desc用于描述表的结构,包括字段名、数据类型等。
  • select用于从数据库表中查询数据。

SQL操作数据库基础

查看所有的数据库

show databases;

创建数据库

create database 数据库名字;
create database today01;

删除数据库

drop database [if exists]数据库库名
drop database today01

更改数据库

alter database 数据库名 character set 编码集;

--------------------------------------------------------------------

查看所有表

show tables;

创建表

create table 表名(
	username varchar(255),
    password int(11)
);
# 1. create table  表名
#  字段名  字段类型(字段长度)字段约束条件
# 2. null / not null / zerofill
# 3. 每个字段定义要用 , 隔开
# 4. 最后一个点不能有符号结尾

查看表的结构

describe user;
desc user;
Feild: 字段名称

Type: 字段类型

Null: 是否可以为空

Key: 是否为主键

Default:  默认值

Extra: 注释

查看创建表语句

show create table 表名;
show create table user;
show create table user \g;
show create table user \G;

删除表

drop table 表名

修改表

alter table 表名 modify 字段名 字段类型;
alter table user modify password char;

重置表的信息

truncate table 表名;

----------------------------------------------------------------------------------------------------------------------------------------

插入数据

insert into 表名(字段1,字段2values(字段值1,字段值2)insert inot 表名 values(字段值1,字段值2); -- 只能按照字段位置插入
insert into user(id,username,password) values(1,'mao','');
insert inot user values(2,'jing','123');

查询数据

​ 查看当前表下面的所有数据

select * from 表名;

​ 查询当前表下面的指定字段的数据

select 字段名 from 表名;

select username from user;

更改数据

updata 表名 set 需要更改的值 where 筛选条件;
updata user set username where id =2;

删除数据

delete from 表名 where 筛选条件
delete user set username where id =2;

【1】创建数据库

  1. MySQL:

    使用MySQL命令行工具,可以按如下方式创建数据库:

    bashCopy Codemysql -u username -p
    # 输入密码后登录到MySQL
    
    CREATE DATABASE database_name;
    

    其中,username是你的MySQL用户名,database_name是要创建的数据库名称。

  2. PostgreSQL:

    使用PostgreSQL命令行工具,可以按如下方式创建数据库:

    bashCopy Codecreatedb -U username database_name
    

    其中,username是你的PostgreSQL用户名,database_name是要创建的数据库名称。

  3. SQLite:

    使用SQLite命令行工具,可以按如下方式创建数据库:

    bashCopy Codesqlite3 database_name.db
    

    其中,database_name是要创建的数据库文件名。

我这里用MySQL数据库来作示例

create database 数据库名;
create database today01

image-20240123213831530

【2】查看数据库

show databases;

image-20240123213923000

查看指定库:

show create database bai;

image-20240123214402850

查看当前数据库的字符集和排序规则:

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'bai';

image-20240123215449567

【3】修改数据库

(1)

语法:

alter database 数据库名 [character set 编码字符集];

示例:

​ 这将显示数据库 “bai” 的默认字符集和排序规则

ALTER DATABASE bai CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

image-20240123215707881

(2)

alter database db2 charset set ='utf8';

image-20240123220332978

【4】删除数据库

drop database 数据库名字;

-- 判断当前数据库是否存在,如果存在则删除
drop database if exists 数据库名字; 

image-20240123220708547

切换数据库

【1】切换数据库

use 数据库名字;

image-20240123220943474

【2】查看当前数据库所在的名字

select database();

image-20240123221105028

【3】查看当前数据库下的所有库

show tables;

image-20240123221236666

【4】创建数据库下面的表

create table 表名(
	字段名1 数据类型1[(存储空间) 字段约束],
    字段名2 数据类型2[(存储空间) 字段约束]
);
create table users(
	id int primary key,
	name varchar(50),
	age int
);
create table user (
	username varchar(255),
    password varchar(255)
);

image-20240123221749675

我创建了两个table表

【5】查看当前表的详细信息

describe 表名;

desc 表名;
desc user;

image-20240123221954492

  • 查看我创建的表的语句

  • show create table 表名 \G;
    
    show create table user \G;
    
    image-20240123222200604

【6】修改表的字段

alter table 表名 modify 字段名 字段类型;
alter table user modify passowrd int(4);

image-20240123222536812

【7】删除表

drop table 表名;
drop table user;

image-20240123111150632

插入表中的数据

【1】插入数据

insert 表名(字段名) values()
create table user2 (
     username varchar(32),
     password varchar(32)
);
insert users(username,password) values("maojing","1314");

image-20240123223935675

【2】查看表中的数据

select * from user;

image-20240123224320181

【3】更改表中的数据

update 表名 set 需要改的数据 where 筛选条件;

这个是更改一个

update user set password="123" where username="tian";

这个是更改两个

UPDATE user SET password = '520' WHERE username IN ('tian', 'maojing');

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

【4】删除数据

-- 按照指定条件删除数据
delete from 表名 where 筛选条件;

-- 直接清空表
delete from 表名;
delete from user where username="dream";

image-20240123112005428


【一】什么是存储引擎

​ 存储引擎是数据库系统中负责管理数据的核心组件之一。它定义了数据库如何在磁盘上存储和访问数据。

  • 日常生活中文件格式有很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制
  • 针对不同的数据应该有对应的不同的处理机制

存储引擎就是不同的处理机制

【二】MySQL主要的存储引擎

  • InnoDB(默认引擎):
    • 支持事务处理,具有ACID(原子性、一致性、隔离性和持久性)特性。
    • 支持行级锁定,提供高并发性能。
    • 支持外键约束和关联关系。
    • 支持崩溃恢复和故障转移。
    • 使用聚簇索引来加速查询。
  • MyISAM:
    • 不支持事务处理,不具备ACID特性。
    • 支持表级锁定,对于并发性能较差。
    • 不支持外键约束和关联关系。
    • 适用于读密集型应用,如数据仓库、报告等。
    • 以表文件的形式存储数据,易于备份和迁移。
  • Memory(也称为Heap):
    • 将表数据存储在内存中,速度非常快。
    • 不支持事务处理,不具备持久性。
    • 表数据在服务器重启后会丢失。
    • 适用于临时数据存储、缓存或者需要高速读写操作的场景。
  • blackhole (黑洞引擎)
    • 无论存什么都会立刻消失

【三】如何查看数据库引擎

show engines;

image-20240123230017799

【四】不同引擎下的表的特性

【1】创建表

create table user1(id int) engine=innodb;
create table user2(id int) engine=myisam;
create table user3(id int) engine=blackhole;
create table user4(id int) engine=memory;

image-20240123230205422

(1)Innodb
  • user1.frm
    • 表结构
  • user1.ibd
    • 表结构

Innodb:默认的引擎

(2)myisam
  • user2.frm
    • 表结构
  • user2.MYD
    • 表数据
  • user2.MYI
    • 索引(index),类似于书的目录,基于目录查找数据的速度会很快

myisam:数据具有索引,读取数据快

(3)blackhole
  • user3.frm
    • 表结构

blackhole:黑洞引擎,存什么数据都会消失

(4)memory
  • user4.frm
    • 表结构

memory:数据缓存到内存

【2】插入数据

insert into user1 values(123);
insert into user2 values(123);
insert into user3 values(123);
insert into user4 values(123);

image-20240123230632408

【3】查看数据

select * from user1;
select * from user2;
select * from user3;
select * from user4;

image-20240123230820719

除了黑洞引擎都存在数据

memory 数据是存在内存中的,如何印证?

  • 重启mysql服务

【一】创建表的完整语法

create table 表名 (
	字段名 字段类型(宽度) 约束条件
);

-- 最后一个字段不能以 , 结尾
-- 字段名和字段类型是必须的条件
CREATE TABLE 表的名称 (    
    column1 datatype constraint, 
   # 字段名 字段类型(宽度) 约束条件
    column2 datatype constraint   
    ...   
    CONSTRAINT constraint_name,  
    # 是对列的约束条件
    ... ) ENGINE = storage_engine;
    # 存储引擎
  • 约束条件可选,约束条件可以写多个
  • 表的名称:替换为你想要创建的表的名称。
  • column1column2:替换为表中的列名。
  • datatype:替换为对应列的数据类型。
  • constraint:替换为对列的约束条件。
  • constraint_name:替换为约束条件的名称。
  • storage_engine:替换为你想要使用的存储引擎,如 InnoDB、MyISAM 等。

【二】基础语法

-- 这三个条件必须存在
create table 表名(
    字段名 字段类型
);
create table user(id int);

image-20240123231806064

【三】什么是宽度

  • 一般情况下指的是对存储数据的限制
    • 默认宽度为 1(只能存一个字符)
  • 创建表
create table user7(name char);

image-20240123232427619

  • 查看表的详细信息
desc user7;
desc bai7;

image-20240123232758663

【四】null 和 not null

  • not null 约束当前字段条件不能为空
create table usr8(id int,name char not null);
insert user8 values(123,'d');
insert user8 values('a');

image-20240123233154820

【五】严格模式

​ 本质上是为了约束我们sql语法规范的,我们可以不按照约束做事,修改他的约束。

%:匹配任意个字符

_:匹配当前字符

【1】查看严格模式

show variables like "%mode";

image-20240123233259363

【2】修改严格模式

  • 全局生效
set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_EN'
  • 只对当前窗口生效
set session sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_EN'

【3】严格模式到底开启还是不开启

  • 5.7 之后的版本默认都是开启严格模式的
  • 尽量减轻数据库的负担,不给数据库增加额外的压力

基本数据类型之整型

【1】整型的分类

tinyint  smallint  mediumint  int  bigint

【2】整型的符号

​ 符号不是用来限制位数的而是用来控制显示长度的

【3】tinyint

  • 是否带符号
    • 默认情况下是带符号, 默认带的符号是 + 号
  • 超出最大范围
    • 超出会报错

【4】unsigned(无符号)

  • 每个整数类型都有无符号的取值范围,超出指定范围就会报错

基本数据类型之浮点型

【1】浮点型的作用

  • 为了更高的精确度

【2】浮点数的分类

  • float   double   decimal
    

【3】浮点数的精确度标准

double 16
decimal

基本数据类型值字符类型

【1】字符的分类

  • char —> 默认长度是1个单位
  • varchar —>必须给长度
create table a1(
	age char
);

create table a2(
	age varchar(255)
);

【2】char 和 varchar 的区别

  • char :定长 超出长度会报错, 不够机会用空格补 -----以前常用
  • varchar: 不定长 超出长度会报错 ----- 现在常用

【3】char_length : 统计字段长度

select char_length(字段名) from 表名;
select char_length(age) from a2;

【4】char跟varchar 的优缺点:

(1)char

  • 缺点:浪费空间
  • 优点:存储简单
    • 直接按照固定的字符存储数据即可

(2)varchar

  • 优点:节省空间
  • 缺点:存储麻烦
    • 存的时候,在真正数据的前面加报头(表示数据真正大小)
    • 取的时候,需要先读取报头,才能读取真实的数据

以前用 char 现在 varchar 使用较多

基本数据类型之时间类型

【1】时间类型的分类

  • date
    • 年月日
  • datetime
    • 年月日时分秒
  • time
    • 时分秒
  • year

【2】时间类型的创建

create table student(
	id int,
    name varchar(16),
    born_year year,
    birth date,
    study_time time,
    reg_time datetime
);

【3】插入数据

insert into student values(
		 1,
    'mao',
    '2001',
    '2001-1-31',
    '11:11:11',
    '2023-6-30 11:11:11'
);

基本数据类型之枚举与集合类型

【1】枚举

(1)枚举类型

enum: 多选一: 多个选择条件只能选择其中一个

(2)集合类型

set: 多选多

【2】枚举的使用方法

create table user(
	id int,
    name char(16),
    gender enum('male','female','others')
);

插入数据

insert into user values(1,'mao','male')
insert into user values(1,'mao','male'),(2,'jing','female'),(3,'yi','others')
  • 只能插入我 定义的 gender enum('male','female','others')
    

【2】集合类型

create table teacher(
	id int,
    name varchar(16),
    gender enum('male','female','others'),
    hobby set('read books','listen music','play games')
);

插入数据

insert into teacher values('1','bai,'male','read books');
insert into teacher values('2','zhi,'male','listen music');

约束条件

【一】什么是约束条件

  • 约束条件:限制表中的数据,保证添加到数据表中的数据准确和可靠性!凡是不符合约束的数据,插入时就会失败!

  • 约束条件在创建表时可以使用,也可以修改表的时候添加约束条件

【二】约束条件概览

  • 主键约束(primary key)
  • 外键约束(foreign key)
  • 唯一约束(unique)
  • 非空约束(not null / null)
  • 零值填充(zerofill)
  • 无符号(unsigned)
  • 组合约束(not null + unique)

【1】非空约束(not null)

( 1 ) 作用

​ 非空约束要求某个字段的值不能为NULL,即不能为空。

( 2 ) 案例

​ 创建 user 表(id ,name, email), name不为空

​ varchar(字符长度)

create table t_user(
  id int(10) ,
  name varchar(32) not null,
  email varchar(128)
);

image-20240124152715542

【2】唯一约束(unique)

( 1 ) 作用

​ 唯一约束确保了列中的值是唯一的,但可以为空。与主键约束不同,唯一约束允许空值。

( 2 ) 案例
alter table b1 modify email varchar(255) unique;

image-20240124153345766

创建表时指定唯一约束

create table table_name (
    id int,
    column1 data_type unique,
    ...
);

修改表结构时指定唯一约束

alter table table_name
add unique (column1);

【3】zerofill

​ 填充字段长度的,当字段值不够字段长度的时候会使用0填充至指定长度。

案例:创建表时指定零值填充
create table table_name (
    id int,
    column1 int zerofill,
    ...
);

修改表结构时指定零值填充:

alter table table_name
modify column1 int zerofill;

---------------------------------------------------------------------------------------------------------------------------------------------------

【4】组合使用

( 1 ) 作用
  • 组合约束是指多个约束的组合使用。使用表级约束给多个字段联合添加约束,unique (name,email) 名字和邮箱这两个字段不能同时重复,但是名字和邮箱字段可以单独重复。
  • 可以给表级约束起名字,这样可以便于操作这个操作(删除、修改等)
( 2 ) 案例 not null 和 unique 同时使用(列级约束)
  • 被 not null 和 unique 约束的字段,该字段即不能为 NULL 也不能重复;
创建表
create table b2(
	id int(10),
	name varchar(98) not null unique
);

image-20240124154223621

插入数据
insert into b2(id) values(1);
# ERROR 1364 (HY000): Field 'name' doesn't have a default value   由于name字段不能为空,所以会报错
insert into b2(id,name) values(2,'mao');

insert	into b2(id,name) values(3,'mao');
# ERROR 1062 (23000): Duplicate entry 'mao' for key 'b2.name'  由于name字段唯一,所以重复数据会报错

image-20240124154650128

【5】查看当前表的约束条件

  • 给约束条件添加名字
查看数据库
show databases;  

image-20240124155245861

切换数据库
use information_schema;

image-20240124155430919

show tables;

image-20240124155606936

image-20240124155649151

table_constraints 该表专门存储约束信息
desc table_constraints;

image-20240124155734352

查看某张表存在哪些约束条件?
select constraint_name from table_constraints where table_name='表名';
select constraint_name from table_constraints where table_name='b2';

image-20240124155911041

---------------------------------------------------------------------------------------------------------------------------------------------------

【6】主键约束(primary key + auto_increment)

( 1 ) 主键约束、主键字段、主键值三者之间关系
  • 表中某个字段添加主键约束之后,该字段被称为主键字段
  • 主键字段中出现的每一个数据都被称为主键值;

主键是一种唯一标识符,用于在表中标识每一行数据。主键约束确保了主键列中的值是唯一的,且不能为空。

( 2 ) 案例
  • 单一约束:加载建表字段的约束条件里
create table b3(
	id int(4) primary key,
    username char(4),
    password char(4)
);

image-20240124164300197

  • 复合约束:可以给多个字段同时加主键约束
create table b4(
	id int(4),
    username char(42),
    password char(42),
    primary key(id,username)
);

image-20240124164408354

  • 先创建一个b5
create table b5(
	id int(10) primary key, 
	name varchar(98) 
);  

# ERROR 1050 (42S01): Table 'b5' already exists
# 已经存在名为b5的表。在MySQL中,每个表的名称必须是唯一的,所以无法创建一个已经存在的表。

image-20240124165855539

  • 查看现有表的创建语句,以获得主键的名称。
show create table b5;

image-20240124170006489

  • 然后,使用ALTER TABLE语句删除现有的主键约束,并使用新的名称创建一个新的主键约束。例如,假设主键约束的名称为id_primary_key,你想将其重命名为new_primary_key
alter table b5
    drop primary key,
    add constraint null primary key(id);

image-20240124170434867

  • 给列重命名

​ 如果你想给已经存在的表中的列重命名,可以使用alter table语句。以下是将b5表中的id列重命名为pass的示例:

alter table b5 change column id pass int(4);

image-20240124170747082

  • 修改主键约束的名称
alter table b5 drop primary key, add constraint id_primary_key primary key(pass);
# primary key(pass)   这个就是键的值   你要确定id里面有没有pass这个值。

image-20240124171318073

【7】主键根据性质分类

  • 自然主键:主键值若是一个自然数,并且这个自然数与业务没有任何关系,这种主键称为自然主键;
  • 业务主键:主键值若和当前表中的业务紧密相关,那么这种主键值被业务主键;如果业务发生改变时,业务主键往往会受到影响,所以业务主键使用较少,大多情况使用自然主键。

【8】自动生成主键 auto_increment

创建一个新的表

create table b6 (
    id int auto_increment primary key,
    name varchar(50),
    age int
);

image-20240124171847064

插入数据时,在需要自动生成主键的列上插入NULL值。MySQL会自动为该列生成唯一的主键值。

insert into b6(name, age) values ('mao', 25),('jing',18);

“b6” 的数据库表中检索所有的数据行和列。

select * from b6;

image-20240124172539617

  • AUTO_INCREMENT 自动递增表示自动递增。这意味着每次向数据表插入新记录时,该字段的值会自动递增生成,而不需要手动指定具体的值。
  • 自增主键的特点就是
    • 在插入数据的时候不指定自增主键的值,就会默认向上增加
    • 再删除该数据后,会发现原来的自增还在,新数据在旧数据的id基础上自增
  • 重置表信息
truncate b6;
# 会将原来的表里面的所有数据都清空,包括你的自增逐渐ID重置为1

image-20240124172907712

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

【9】外键约束FK (foreign key)

	外键约束用于定义表之间的关系,在一个表中创建一个外键指向另一个表的主键。它可以保证数据之间的引用完整性,例如在两个表之间建立关联关系、实现级联删除等。

三个概念

  • 外键约束,外键字段,外键值
  • 外键约束:添加在建表语句字段类型后面的约束条件 foreign key
  • 外键字段:某个·字段添加外键约束之后,该字段为外键字段。
  • 外键值:外键字段中的每一个数据都是外键值。

外键类型

  • 外键字段
    • 逻辑性外键:理论上存在外键关系,实际上没有建立外键联系
    • 物理性外键:理论上存在外键关系,并且字段具有外键约束

【10】外键语法

  • 先要创建表
  • 先有了需要被建立关系的表才能让建立关系的表和他建立关系
create table 表名1 (
    -- 外键自增字段
    id int(4) primary key auto_increment,
	字段名1 字段类型1 约束条件1 comment 注释1,
	字段名2 字段类型2 约束条件2 comment 注释2
);
create table 表名2 (
    id int(4) primary key auto_increment,
	字段名1 字段类型1 约束条件1 comment 注释1,
	字段名2 字段类型2 约束条件2 comment 注释2foreign key(在表名2中现实的字段名) references 表名1(表名1中需要建立外键关系的字段名)
    
);
comment 就是在后面添加注释用的参数

references  这个是必备参数。如果你不使用 REFERENCES 关键字,就无法创建外键约束,因为它是必需的参数之一。

【11】一对多关系的建表思路

  • 先创建两个表,一个为主表(one)和一个为从表(many)
  • 在“从表”中 创建一个外键列,该外键列引用了“主表”的主键列。
  • 将外键约束添加到“从表”的外键列上,以确定引用的完整性和一致性。

主表:

create table department (
    id int(4) primary key auto_increment comment '部门表的ID',
    department_name varchar(56) comment '部门名称',
    department_desc text comment '部门介绍'
);                     

从表:

create table employees (
  id int(4) primary key auto_increment comment '员工ID',
  name varchar(50) comment '员工名字',
  age int(4) comment '员工年龄',
  department_id int(4) comment '外键关联部门ID',
  foreign key (department_id) references department(id)
);

​ 如果你不使用 references 关键字,就无法创建外键约束,因为它是必需的参数之一。

drop table employees;
drop table department;

image-20240125154457926

image-20240125154515987

  • 创建顺序
    • 先创建被关联的表
    • 再创建需要添加外键字段的表
  • 删除顺序
    • 先删除添加外键字段的表
    • 再删除被关联的表

【12】外键联系的分类

  • 一张表和另一张表建立联系

    • 一对一

    • 一对多

    • 多对多

    • 没关系

【1】一对多关系
  • 以员工表和部门表来说
    • 员工可不可以只对应一个部门?
      • 默认是可以的
    • 部门是不是可以有多个员工?
      • 部门可以有多个员工
  • 总结
    • 部门是一
    • 员工是多
  • 一对多关系将外键建立在哪一方?
    • 将外键建在多的这一方

上面建立部门与员工的表就是一对多的关系

# 员工表
id name age

# 部门表
id department_name department_desc
create table department (
    id int(4) primary key auto_increment comment '部门表的ID',
    department_name varchar(56) comment '部门名称',
    department_desc text comment '部门介绍'
);  

create table employees (
  id int(4) primary key auto_increment comment '员工ID',
  name varchar(50) comment '员工名字',
  age int(4) comment '员工年龄',
  department_id int(4) comment '外键关联部门ID',
  foreign key (department_id) references department(id)
);
【2】多对多关系
  • 以学生表和课程表来说
    • 一个学生可不可以选择多门课程
      • 默认是可以的
    • 一门课程是不是可以被多名学生选择?
      • 一门课程可以被多名课程选择
  • 总结
    • 学生是多
    • 课程是多
  • 学生跟课程之间的关系就是多对多
-- 建立在第三张表中

第一种:

create table student(
	student_id int primary key auto_increment,
    student_name varchar(23),
    student_grade varcahr(8),
    course_id int,
    foreign key(course_id) references course(id)
);
create table course(
	course_id int primary key auto_increment,
    course_name varchar(23),
    course_grade varcahr(8),
    student_id int,
    foreign key(student_id) references student(id)
);
	# 这个示例中,你试图在学生表和课程表中都添加了一个外键,以建立多对多关系。这样的设计是不正确的,因为它会导致循环依赖和无法创建外键约束。

第二种 针对多对多关系 需要单独开设第三张表专门存储关系

create table student1(
	id int primary key auto_increment,
    student_name varchar(23),
    student_grade varchar(56)
);

create table course(
	course_id int primary key auto_increment,
    course_name varchar(23),
    course_grade enum('go','python','java')
    );



create table course_student(
	id int primary key auto_increment,
    student_id int,
    foreign key(student_id) references student1(id),
    course_id int,
    foreign key(course_id) references course(course_id)
    
);

image-20240125165530565

【3】一对一关系

原则是那张使用频率搞,外键字段就在哪一方。

  • 一个是员工表(employee):包含员工的基本信息,如员工编号、姓名等

  • 另一个是工资表(salary):包含员工的薪资信息,如基本工资、津贴等。

    其中,每个员工只有一条薪资记录,一个薪资记录也只对应一个员工。

create table employee (
  employee_id int primary key,
  name varchar(50),
  department varchar(50),
  position varchar(50)
);


create table salary (
  id int primary key,
  employee_id int unique,
  basic_salary decimal(10, 2),
  allowance decimal(10, 2),
  foreign key (employee_id) references employee(employee_id)
);


insert into employee (employee_id, name, department, position) values (1, 'alice', 'sales', 'manager');
insert into employee (employee_id, name, department, position) values (2, 'bob', 'marketing', 'analyst');

insert into salary (id, employee_id, basic_salary, allowance) values (1, 1, 5000.00, 1000.00);
insert into salary (id, employee_id, basic_salary, allowance) values (2, 2, 4000.00, 800.00);

image-20240125173024439

image-20240125173046170

image-20240125173100204

数据分类

  • 存储和使用频率高的数据称之为热数据
  • 存储和使用频率低的数据称之为冷数据

【13】级联更新和级联删除

​ 当两个或者多个表之间存在关联关系,且启用了级联更新或者级联删除规则时,对主表中的数据进行更新或者删除操作时,相关联的从表中的数据也会相应进行更新或者删除。

具体来说:

  • 级联更新(on update cascade):当主表中的某一行数据的关联字段(外键字段)发生了更新时,所有相关联的从表中的对应的关联字段也会进行相应的更新。这样可以保证从表中的数据与主表的数据保持一致。
  • 级联删除(on delete cascade):当主表中的某一行数据被删除时,所有相关联的从表中的对应行也会被自动删除。这样可以确保主表和从表之间的数据的完整性,避免出现孤立的数据。

​ 需要注意的是,启用级联更新或级联删除规则需要谨慎操作,因为它们可能会导致连锁反应,对数据库的性能产生影响。

insert into department(department_name,department_desc) values('cook','厨房');
insert into 
department(department_name,department_desc) values('media','传媒部门');

image-20240125190038801

插入employees表中的数据

insert into employees(name,age) values('moajing','21');
insert into employees(name,age) values('baizhi','21');

image-20240125190435623

你可以这样添加级联更新和级联删除 (这种方法是在表没有创建的情况下)

# 创建被约束的表
create table department(
	id int(4) primary key auto_increment comment "部门表id",
    department_name varchar(32) comment "部门名称",
    department_desc text comment "部门介绍"
);

# 创建外键约束的表,前提是被建立连接的表先创建
create table employees(
	id int(4) primary key auto_increment  comment "员工id",
    name varchar(32) comment "员工名字",
    age int(4) comment "员工年龄",
    department_id int(4) comment "外键关联部门id",
	foreign key(department_id) references department(id)
    on update cascade
    on delete cascade
);

如果你已经创建表了

alter table employees
# 添加外键约束的语句,并给外键约束命名为"fk_department":
  add constraint fk_department
  foreign key (department_id)
  references department(id)
  on update cascade
  on delete cascade;

查看表的结构

desc employees;

image-20240125191934054

查看表中的所有数据

select * from employees;
select * from department;

image-20240125192123670

查看特定部门的信息

select * from department where id = 1;

image-20240125191755975

关联的从表中的对应行也会被自动删除。这样可以确保主表和从表之间的数据的完整性,避免出现孤立的数据。

​ 需要注意的是,启用级联更新或级联删除规则需要谨慎操作,因为它们可能会导致连锁反应,对数据库的性能产生影响。

insert into department(department_name,department_desc) values('cook','厨房');
insert into 
department(department_name,department_desc) values('media','传媒部门');

[外链图片转存中…(img-otDzVHGw-1710985515770)]

插入employees表中的数据

insert into employees(name,age) values('moajing','21');
insert into employees(name,age) values('baizhi','21');

[外链图片转存中…(img-zTMYO4Xj-1710985515771)]

你可以这样添加级联更新和级联删除 (这种方法是在表没有创建的情况下)

# 创建被约束的表
create table department(
	id int(4) primary key auto_increment comment "部门表id",
    department_name varchar(32) comment "部门名称",
    department_desc text comment "部门介绍"
);

# 创建外键约束的表,前提是被建立连接的表先创建
create table employees(
	id int(4) primary key auto_increment  comment "员工id",
    name varchar(32) comment "员工名字",
    age int(4) comment "员工年龄",
    department_id int(4) comment "外键关联部门id",
	foreign key(department_id) references department(id)
    on update cascade
    on delete cascade
);

如果你已经创建表了

alter table employees
# 添加外键约束的语句,并给外键约束命名为"fk_department":
  add constraint fk_department
  foreign key (department_id)
  references department(id)
  on update cascade
  on delete cascade;

查看表的结构

desc employees;

[外链图片转存中…(img-HvgLcyZV-1710985515771)]

查看表中的所有数据

select * from employees;
select * from department;

[外链图片转存中…(img-PllMFdfU-1710985515771)]

查看特定部门的信息

select * from department where id = 1;

[外链图片转存中…(img-bNcIc9JV-1710985515771)]

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

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

相关文章

MQTT.fx和MQTTX 链接ONENET物联网提示账户或者密码错误

参考MQTT.fx和MQTTX 链接ONENET物联网开发平台避坑细节干货。_mqttx和mqttfx-CSDN博客 在输入password和username后还是提示错误,是因为在使用token的时候,key填写错误,将设备的密钥填入key中

webpack练习之手写loader

手写一个style-loader来把样式文件插入head里面,准备工作 vue webpack就自己弄了,webpack的一些配置也自己配置好 一、创建index.css文件 .box{width: 100px;height: 100px;background-color: red; }然后在vue的main.js文件中引入它 二、创建自定义l…

MyBatis-Plus分页接口实现教程:Spring Boot中如何编写分页查询

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

港大新工作 HiGPT:一个模型,任意关系类型 !

论文标题: HiGPT: Heterogeneous Graph Language Model 论文链接: https://arxiv.org/abs/2402.16024 代码链接: https://github.com/HKUDS/HiGPT 项目网站: https://higpt-hku.github.io/ 1. 导读 异质图在各种领域&#xf…

云原生靶场kebernetesGoat、Metarget

靶场 文章目录 靶场kebernetesGoat靶场安装Docker in DockerSSRF漏洞容器逃逸到主系统Docker CIS 基线分析Kubernetes CIS 安全基线分析分析被部署挖矿软件的容器镜像获取环境信息Hidden in layersRBAC最低权限配置错误使用 Sysdig Falco 进行运行时安全监控和检测 Metarget ke…

UE5、CesiumForUnreal实现海量POI撒点显示与聚合功能

1.实现目标 POI是UE+GIS三维场景中经常需要展示的要素,在UE中常用的表示POI方法有两种。一种是Mesh,即空间的方式;另一种是Widget,即屏幕上的方式,本文这里使用的是Widget屏幕展示的形式来表示POI。 本文这里使用的POI点位数量共3.3w+,采用直接网格聚合算法,并进行性能优…

ROS机器人入门第四课:话题通信

文章目录 ROS机器人入门第四课:话题通信一、话题通信概述(一)概念(二)作用 二、话题通信基本操作需求:分析:流程:(一)发布方解释一些关键的ROS函数和概念: (二&#xff0…

2024年福建事业单位招聘详细流程

2024年福建事业单位招聘详细流程,速速查收!

湖北汽车工业学院 实验一 关系数据库标准语言SQL

头歌 实验一 关系数据库标准语言SQL 制作不易!点个关注呗!为大家创造更多的价值! 目录 头歌 实验一 关系数据库标准语言SQL**制作不易!点个关注呗!为大家创造更多的价值!** 第一关:创建数据库第…

简单服务器通信、IO多路复用(select、poll、epoll)以及reactor模式。

网络编程学习 简单服务器通信TCP三次握手和四次挥手三次握手(如下图)常见问题? 四次挥手 client和server通信写法server端client端 通信双方建立连接到断开连接的状态转换怎么应对多用户连接?缺点 IO多路复用select优缺点 pollpol…

算法---动态规划练习-5(下降路径最小和)

下降路径最小和 1. 题目解析2. 讲解算法原理方法一方法二 3. 编写代码法一法二 1. 题目解析 题目地址:点这里 2. 讲解算法原理 方法一 首先,通过matrix的大小确定矩阵的行数m和列数n。 创建一个大小为(m1) (n2)的二维动态规划数组dp,其中d…

OC 技术 苹果内购

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络&#xff0…

2022 年甘肃省职业院校技能大赛 高职组 网络系统管理竞赛 网络构建模块试题

2022 年甘肃省职业院校技能大赛 高职组网络系统管理竞赛 网络构建模块试题 目 录 考试说明… 3 任务描述… 3 任务清单… 3 (一)基础配置… 3 (二)有线网络配置… 4 (三)无线网络配置… 6 (四&a…

惊艳亮相!新版飞桨星河社区邀您共赴星辰大海

亲爱的开发者们: 一场始于好奇、归于热爱的邂逅,让开发者们在飞桨星河社区相聚,相逢于活动、课程、比赛、项目……五年来,千万开发者的共同参与,让这个社区更富活力、更加温暖。 2018年,AI Studio 1.0版本上…

RHCE- 4-Web服务器(2)

基于https协议的静态网站 概念解释 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。 HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中…

LVS负载均衡(load balance)

一 LVS LVS:Linux Virtaul Server,该软件的功能是实现 LB(load balance) 二LVS 的三种工作模式 1.NAT 模式(NAT) LVS 服务器同时充当一台 NAT 网关,拥有公有 IP ,同时负责将针对此…

Apple Vision Pro应用合集

这里给大家分享一个网站,手机了最新的apple vision pro 上面运行的应用。 1、查找应用:用户可以浏览特色推荐的应用,或者通过随机挑选功能发现新的应用。 2、社区交流:提供社区功能,用户可以在这里交流使用体验、分享…

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件 0. 引言1. 安装 Markdown Viewer 插件2. 使用 Markdown Viewer 阅读 Markdown 格式文件 0. 引言 大部分程序员都喜欢 Markdown 格式的文件,这时给一些没有在电脑上安装 Markdown 编辑器的同事分享资料时&…

SAP gui 组服务器 提示 Error service sapmsPRD unknown

/etc/hosts 追加IP地址和域名的配对关系 /etc/services 追加 sapms[sid] 3601/tcp

java数据结构与算法刷题-----LeetCode665. 非递减数列

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路:时间复杂度O( n n n),空间复杂度…