mysql修改级联表数据_MySQL数据库 外键,级联, 修改表的操作

本文详细介绍了MySQL数据库中外键的概念及其在一对多、多对多、一对一关系中的应用。通过示例展示了如何创建和管理外键,以及如何进行级联更新和级联删除操作。此外,还讲解了如何修改和复制表结构,强调了外键在确保数据完整性和一致性方面的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.外键: 用来建立两张表之间的关系

- 一对多

- 多对多

- 一对一

研究表与表之间的关系:

1.定义一张 员工部门表

id, name, gender, dep_name, dep_desc

- 将所有数据存放在一张表中的弊端:

1.结构不清晰 ---> 不致命

2.浪费空间 ---> 不致命

3.可扩展性极差 ---> 不可忽视的弊端

- 类似于将所有python代码存放在一个py文件中,强耦合到一起了----> 解耦合 ----> 拆分表

- 拆分表解决以上问题.

- 需要给两张表之间,建立一种强有力的关系, 使用 “外键”

- !!!!! ****** 如何确认表与表之间的关系是 (一对多、多对多、一对一)

- 注意: 要确立两张表之间的关系,必须站在两个位置去思考:

- 站在员工表的位置: 多个员工能否对应一个部门? 能!!!

- 员工与部门: 多 对 一

- 员工表单向 多 对 一 部门表

- 站在部门表的位置: 多个部门能够对应一个员工? 不能!!!

总结: 凡是单向 多 对 一 的表关系,称之为 一对多 的外键关系。

- 外键: 语法: foreign key(当前表中建立关系的外键字段) references 被关联表名(id)

23c85a63ab548f4f6d362465a804a2a1.png

- 一对多

# 创建两张表

1.必须先建立被关联表,再建立关联表

# 被关联表:

dep:

create table dep(

id int primary key auto_increment,

dep_name varchar(16),

dep_desc varchar(255)

);

# 关联表:

emp:

create table emp(

id int primary key auto_increment,

name varchar(16),

age int,

gender enum('male', 'female', 'others') default 'male',

dep_id int not null,

foreign key(dep_id) references dep(id)

);

b6401dc5efc5d252bff3bfb4987ebb1b.png

注:KEY中MUL代表外键

# 插入数据:

- 1.必须先插入被关联表(dep)的数据,再插入关联表(emp)的数据。

# dep:

insert into dep(dep_name, dep_desc) values('nb_外交部', '国际形象大使部门'),

('sb_教学部', '造程序员部门!!!!'),

('技术部', '技术有限部门');

# emp:

insert into emp(name, age, gender, dep_id)

values('tank', 17, 'male', 1),

('jason', 70, 'male', 2),

('sean', 50, 'male', 2),

('egon', 88, 'male', 2),

('owen', 95, 'female', 3);

# 报错,

insert into emp(name, age, gender, dep_id) values('大饼', 100, 'others', 999);

-级联更新与级联删除(把关联数据一起变更)

- on update cascade

- on delete cascade

-创建表

#被关联表:

dep2:

create table dep2(

id int primary key auto_increment,

dep_name varchar(16),

dep_desc varchar(255)

);

#关联表:

emp2:

create table emp2(

id int primary key auto_increment,

name varchar(16),

age int,

gender enum('male','female','others') default 'male',

dep_id int not null,

foreign key(dep_id) references dep2(id)

on update cascade

on delete cascade

);

- 插入数据

#dep:

insert into dep2(dep_name,dep_desc)values('nb_外交部','国际形象大使部门'),

('sb_教学部','造程序员部门!!!!'),('技术部','技术有限部门');

#emp:

insert into emp2(name,age,gender,dep_id)

values('tank',17,'male',1),

('jason',70,'male',2),

('sean',50,'male',2),

('egon',88,'male',2),

('owen',95,'female',3);

#报错

insert into emp(name,age,gender,dep_id)values('大饼',100,'others',999);

- 更新数据或删除数据

-更新记录

update dep2 set id=200 where id=1;

-删除记录

delete from dep2 where id=200;

986e9a4ca81bee1664103112d9b5b14d.png

因为级联,关联数据一起变更为200

注意:mysql中没有多对一,只有一对多

- 多对多

也必须站在两张表的位置去思考;

df1bbabd6522ce0f1acd4017d12fb172.png

- 错误示范:

#- 创建book表

create table book(

id int primary key auto_increment,

title varchar(20),

price int,

book_content varchar(255),

author_id int,

foreign key(author_id) references author(id)

on update cascade

on delete cascade

);

#- 创建author表

create table author(

id int primary key auto_increment,

name varchar(16),

age int,

book_id int,

foreign key(book_id) references book(id)

on update cascade

on delete cascade

);

- 问题: 无法知道哪张表是被关联表

- 利用第三张表,为两张表建立“多对多外键关系”。

#-book:

create table book(

id int primary key auto_increment,

title varchar(20),

price int,

book_content varchar(255)

);

#-auther:

create table author(

id int primary key auto_increment,

name varchar(16),

age int

);

#-book2author:

create table book2author(

id int primary key auto_increment,

book_id int,

author_id int,

foreign key(book_id) references book(id)

on update cascade

on delete cascade,

foreign key(author_id) references author(id)

on update cascade

on delete cascade

);

be8ef17313e5455e0682e257e4dec65d.png

- 插入数据

#- book

insert into book(title, price, book_content) values

('金瓶mei', 199, '讲述朦胧时光的小故事'),

('python从入门到断气', 2000, '学习如何一夜秃头'),

('三体', 200, '跟着大佬进入宇宙奇幻世界')

;

- author

insert into author(name, age) values

('egon', 68),

('jason', 88);

- book2author:

insert into book2author(book_id, author_id) values

(1, 1),

(1, 2),

(2, 2),

(3, 1);

# 报错, 插入的数据,book_id, author_id必须存在

insert into book2author(book_id,author_id) values(4, 4);

# 更新或删除

#更新

update book set price =666 where id =1;

update book set id=4 where id=1;

#删除

delete from book where id=4; (会删除关联表内容)

- 一对一:

a309c24b7afb51f0fa22b7ec11734ce9.png

- user_info:

id, name, age, gender, hobby, id_card

- user:

id , name, age, detail_id(外键)

- detail:

id, gender, hobby, id_card

user与detail表建立了 一对一的外键 关系。

foreign key 应该建在 使用频率较高的一方。

-创建表

#被关联表

create table customer(

id int primary key auto_increment,

name varchar(16),

media varchar(32)

);

#关联表

create table student(

id int primary key auto_increment,

addr varchar(255),

phone_char(11),

id_card char(18),

# 外键必须设置成唯一的

customer_id int unique,

forign key(customer_id) references customer(id)

on update cascade

on delete cascade

);

- 插入数据

insert into customer(name,media) values

('hcy','facebook'),

('zsb1','ig'),

('zsb2','vk'),

('hb','探探');

insert into student(addr,phone,id_card,customer_id) values

('上海', '', '', 1),

('北京', '', '', 2);

# 报错,一对一,关系必须 一一对应

insert into student(addr, phone, id_card, customer_id) values ('上海', '', '', 1);

- 插入数据:

insert into

修改表的操作

- 语法: 注意: mysql 关键字不区分大小写

1. 修改表名

ALTER TABLE 表名 RENAME 新表名;

2. 增加字段

ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…],ADD 字段名 数据类型 [完整性约束条件…]; # 添加到最后一列

ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 添加到第一列

ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 添加到某一列之后

3. 删除字段

ALTER TABLE 表名 DROP 字段名;

4. 修改字段

ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; # 修改数据类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; # 修改字段名,保留字段类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; # 修改字段名与字段类型

- 复制表的操作:

复制表结构+记录 (key不会复制: 主键、外键和索引)

mysql> create table new_service select * from service;

只复制表结构

# 将select * from service where 1=2; ---> 不要真实数据,需要表结构

mysql> create table new_customer select * from customer where 1=2;

MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)

MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作): a.创建2张表 create table userinfo(nid int not nul ...

第二百八十节,MySQL数据库-外键链表之一对多,多对多

MySQL数据库-外键链表之一对多,多对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索 ...

MySQL数据库(4)_MySQL数据库外键约束、表查询

一.外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...

MySQL数据库--外键约束及外键使用

什么是主键.外键关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯 ...

mysql数据库外键、主键详解

一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如  学生表(学号,姓名,性别,班级) 其中每个学生的学 ...

Database学习 - mysql 数据库 外键

外键 外键约束子表的含义:如果在父表中赵达不到候选键,则不允许在子表上进行insert/update 外键预约对父表的含义:在父表上进行update/delete以更新或删除子表中有一条或多条对应匹配 ...

MySQL数据库-外键链表之一对多,多对多

外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索引 一对多:就是b表的某一个字段值对应a表外 ...

(4)MySQL的外键(不同表之间的数据关联)

问题:下列这张表中部门等列名下输入的数据没有约束,那么可以随便填写符合规则的数据但是不符合实际需求的值,这样就造成了不符合规则的数据在表中存在,外键就是为了解决这个问题,管理员可以在另一张表中设置好符 ...

黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束

/* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...

随机推荐

swift 定位

iOS 8 及以上需要在info.plist文件中添加下面两个属性 NSLocationWhenInUseUsageDescription 使用应用期间 NSLocationAlwaysUsageDe ...

poj 1830 开关问题

开关问题 题意:给n(0 < n < 29)开关的初始和最终状态(01表示),以及开关之间的关联关系(关联关系是单向的输入a b表示a->b),问有几种方式得到最终的状态.否则输出字 ...

Html5的&lt&semi;button&gt&semi;标签

1.标签是双标签,其内可添加文字,图片等复杂的样式. ​2.不仅可以在表单中使用,还可以在其他块元素和内联元素中使用. 3.一般在input标签内添加name属性,否则提交后不显示.

win10关不了机解决办法以及win10怎么禁止开机启动项

1.win10关不了机解决办法:https://zhidao.baidu.com/question/693962749213927924.html 2.win10怎么禁止开机启动项:https://j ...

Java的常用命令javac与java

javac 可以使用javac -h来查看常用的命令: -> ~ # javac -help 用法: javac 其中, ...

Linux使用笔记

1:Ubuntu系统获取超级权限: 在终端输入:sudo passwd,重置uinx密码.然后输入 su ,输入密码,即可进入root权限. 2:更改文件属性 Linux文件的基本权限有九个,分别是o ...

case when 多个条件 以及case when 权重排序

1. case when 多个条件 语法: SELECT nickname,user_name,CASE WHEN user_rank = '5' THEN '经销商' WHEN user_rank ...

mxnet数据操作

# coding: utf-8 # In[2]: from mxnet import nd # In[3]: x = nd.arange(12) x # In[4]: x.shape,x.size # ...

腾讯Web前端开发框架JX&lpar;Javascript eXtension tools&rpar;

转自:Web前端开发-Web前端工程师 » 腾讯Web前端开发框架JX(Javascript eXtension tools) JX – Javascript eXtension tools 一个类似 ...

洛谷P4762 &lbrack;CERC2014&rsqb;Virus synthesis(回文自动机&plus;dp)

传送门 回文自动机的好题啊 先建一个回文自动机,然后记$dp[i]$表示转移到$i$节点代表的回文串的最少的需要次数 首先肯定2操作越多越好,经过2操作之后的串必定是一个回文串,所以最后的答案肯定是由 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值