mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)
字段的修改、添加和删除
create table tf1(
id int primary key auto_increment,
x int,
y int
);
#修改
alter table tf1 modify x char(4) default'';
alter table tf1 change y m char(4) default '';
#增加
alter table 表名 add 字段名 类型[(长度) 约束];
>:alter table student add name char(4) first;
>:alter table student add age int unsigned after name;
#删除
alter table 表名 drop 字段名;
>: alter table student drop age;
外键
'''
作者(author):id,name, sex, age, mobile, author_id
作者详情(author_detail):id, info, address
'''
# 外键:通常命名规范是(关联表_关联字段)
# 语法:foreign key(所在表的外键字段) references 关联表(关联字段)
# 在作者详情表中写 eg: foreign key(author_id) references author_detail(id);
#级联关系
'''
级联更新:on update cascade
#就是说,A和B之间用外键a进行了关联,那么我对A中的外键a修改成b,那么B中的主键也会被修改,例如语句:update author_detail set id=10 where id=1;则会把author_detail表中id为1的字段设置为id为10,相对应的author表中选择id=1当做外键的字段也会把外键author_id设置为10.
级联删除:on delete cascade
#比如,学生表中学生A的主键是id=2,成绩表中有外键student_id=2,那么我们用语句:delete from student where id = 2,这样在成绩表里面学生A的记录就全部删掉了。
'''
多表关系
"""
一对一:就是一一对应的关系,比如丈夫和妻子,作者和作者详情
一对多:就是一个和多个对应的关系,比如部门和员工,书籍和出版社
多对多:就是多个和多个之间进行对应,比如老师和班级,出版社和作者
"""
#外键就是 建立表与表关联的字段, 通常 一个表的外键是另外一个表的主键(唯一键也可以), 例如在多对多对应的中,K1是老师A的外键,那么K1就可以在班级表中唯一的确定一个班级(即K1是班级的主键)
#外键值就是外键在表中对应的主键值
'''
一对一:外键在任何一方都可以,此时外键要设置成唯一键,例如作者和作者详情:Q是作者A的外键,那Q在作者详情表中一定是唯一确定的
一对多:外键必须放在多的一方,外键值是不唯一的,例如书和出版社:Q是书A的外键,Q也就出版社的主键,唯一确定一个出版社P,但是P可能还出版了书B,而B同样有外键Q,这样Q的外键值就包括了A和B了。
多对多:一定要创建第三张表(关系表),每一个外键值不唯一,还可以多个外键值联合唯一, 例如作者和出版社,
作者(author):id, name, age
出版社(publish):id, name, address
作者与出版社关系表:id, author_id, publish_id
id author_id publish_id
1 1 1
2 1 2
3 2 1
4 2 2
从上面可以看出,关系表的外键A是作者表的主键,可以唯一确认一个作者,外键B是出版社表的主键,可以唯一确认一个出版社,这样A和B的组合就可以是联合唯一了,即在第三张表中唯一确认。
'''
单表详细操作:增删改
一对一:无级联关系
# 作者详情(author_detail): id,info,address
create table author_detail(
id int primary key auto_increment,
info varchar(256),
address varchar(256)
);
# 作者表id,name,sex,age,mobile, detail_id
create table author(
id int primary key auto_increment,
name varchar(64) not null,
mobile char(11) unique not null,
sex enum('男', '女') default '男',
age int default 0,
detail_id int unique not null,
foreign key(detail_id) references author_detail(id)
);
# 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据
mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');
mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);
mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');
mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);
# 修改关联表 author
mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');
mysql>: update author set detail_id=3 where detail_id=2; # 有未被其他数据关联的数据,就可以修改
# 删除关联表 author
mysql>: delete from author where detail_id=3; # 直接删除
# 修改被关联表 author_detail
mysql>: update author_detail set id=10 where id=1; # 无法修改
# 删除被关联表 author_detail
mysql>: delete from author_detail where id=1; # 无法删除
# 没有级联关系下:
# 增加:先增加被关联表记录,再增加关联表记录
# 删除:先删除关联表记录,再删除被关联表记录
# 更新:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)
一对一:有级联关系
mysql>: drop table author;
mysql>: drop table author_detail;
# 作者详情(author_detail): id,info,address
create table author_detail(
id int primary key auto_increment,
info varchar(256),
address varchar(256)
);
# 作者表id,name,sex,age,mobile, detail_id
create table author(
id int primary key auto_increment,
name varchar(64) not null,
mobile char(11) unique not null,
sex enum('男', '女') default '男',
age int default 0,
detail_id int unique not null,
foreign key(detail_id) references author_detail(id)
on update cascade
on delete cascade
);
# 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据
mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1); # 错误
mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');
mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);
mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');
mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);
# 修改关联表 author
mysql>: update author set detail_id=3 where detail_id=2; # 失败,3详情不存在(此处是关联表,即把第id为2的字段修改为id=3的)
mysql>: update author set detail_id=1 where detail_id=2; # 失败,1详情已被关联
mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');
mysql>: update author set detail_id=3 where detail_id=2; # 有未被其他数据关联的数据,就可以修改
# 删除关联表 author
mysql>: delete from author where detail_id=3; # 直接删除
# 修改被关联表 author_detail
mysql>: update author_detail set id=10 where id=1; # 级联修改,同步关系关联表外键
# 删除被关联表 author_detail
mysql>: delete from author where detail_id=10; # 可以删除对被关联表无影响
mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 10);
mysql>: delete from author_detail where id=10; # 可以删除,将关联表的记录级联删除掉
一对多
# 一对多:外键必须放在多的一方,此时外键值不唯一
# 出版社(publish): id,name,address,phone
create table publish(
id int primary key auto_increment,
name varchar(64),
address varchar(256),
phone char(20)
);
# 书(book):id,name,price,publish_id, author_id
create table book(
id int primary key auto_increment,
name varchar(64) not null,
price decimal(5, 2) default 0,
publish_id int, # 一对多的外键不能设置唯一
foreign key(publish_id) references publish(id)
on update cascade
on delete cascade
);
# 增:先增加被关联表(publish)的数据,再增加关联表(book)的数据
mysql>: insert into publish(name, address, phone) values
('人民出版社', '北京', '010-110'),
('西交大出版社', '西安', '010-119'),
('老男孩出版社', '上海', '010-120');
mysql>: insert into book(name, price, publish_id) values
('西游记', 6.66, 1),
('东游记', 8.66, 1),
('python从入门到入土', 2.66, 2),
('轮程序员修养之道', 3.66, 3),
('好好活着', 88.88, 3);
# 没有被关联的字段,插入依旧错误
mysql>: insert into book(name, price, publish_id) values ('打脸之道', 0.3, 4); # 失败
# 更新:直接更新被关联表的(publish) 主键,关联表(book) 外键 会级联更新
mysql>: update publish set id=10 where id=1;
# 更新:直接更新关联表的(book) 外键,修改的值对应被关联表(publish) 主键 如果存在,可以更新成功,反之失败
mysql>: update book set publish_id=2 where id=4; # 成功
mysql>: update book set publish_id=1 where id=4; # 失败
# 删:
# 删被关联表,关联表会被级联删除
mysql>: delete from publish where id = 2;
# 删关联表,被关联表不会发生变化
mysql>: delete from book where publish_id = 3;
# 假设:书与作者也是 一对多 关系,一个作者可以出版多本书
create table book(
id int primary key auto_increment,
name varchar(64) not null,
price decimal(5, 2) default 0,
publish_id int, # 一对多的外键不能设置唯一
foreign key(publish_id) references publish(id)
on update cascade
on delete cascade
# 建立与作者 一对多 的外键关联
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
);
多对多
# 多对多:一定要创建第三张表(关系表),每一个外键值不唯一,看可以多个外键建立联合唯一
mysql>: drop table author;
mysql>: drop table author_detail;
mysql>: drop table book;
mysql>: drop table publish;
# 作者(author):id, name, age
create table author(
id int primary key auto_increment,
name varchar(64),
age int unsigned default 0
);
# 出版社(publish):id, name, address
create table publish(
id int primary key auto_increment,
name varchar(64),
address varchar(256)
);
# 作者与出版社关系表:id, author_id, publish_id
create table author_publish(
id int primary key auto_increment,
# 关系表一定有多个外键,关联着多张表
# 关联作者表
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
# 关联出版社表
publish_id int,
foreign key(publish_id) references publish(id)
on update cascade
on delete cascade,
# 建立两个字段的联合唯一
unique(author_id, publish_id)
);
# 注:关系表 关联着 作者 和 出版社 两张表,在表结构上 作者 与 出版社 两表键没有任何关系
# 增:两张被关联表,没有前后关系,但关系表必须在两个表都提供数据后才能进行 关系匹配
mysql>: insert into author(name, age) values('ruakei', 67),('engo', 76),('Lxx', 3);
mysql>: insert into publish(name, address) values('老男孩出版社', '上海'),('小女孩出版社', '北京');
# 操作关系表:
mysql>: insert into author_publish(author_id, publish_id) values(1,1),(1,2),(2,1),(2,2),(3,1);
# 关系表操作:增、删、改,只要两张被关系表有提供对应的操作数据,都可以操作成功,且对两张被关系表没有影响
# 操作两张被关系表:
# 增:不会影响关系表
mysql>: insert into publish(name, address) values('西交大出版社', '西安');
# 改:关系表都会级联更新
mysql>: update publish set id=10 where id=1;
# 删:关系表都会级联删除
mysql>: delete from author where name='ruakei';
mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)的更多相关文章
- MySQL表关系--外键
一.外键前戏 如果我们把所有的信息都记录在一张表中会带来的问题: 1.表的结构不清晰 2.浪费磁盘空间 3.表的扩展性极差 所以我们要把这种表拆成几张不同的表,分析表与表之间的关系. 确定表与表之间的 ...
- MySQL:创建、修改和删除表
其实对很多人来说对于SQL语句已经忘了很多,或者说是不懂很多,因为有数据库图形操作软件,方便了大家,但是我们不能忘记最根本的东西,特别是一些细节上的东西,可能你用惯了Hibernate,不用写SQL语 ...
- [MYSQL][1]创建,修改,删除表
查看有哪些数据库: SHOW DATABASES; 创建,删除数据库: CREATE DATAABASE mydb; DROP DATABASE mydb; 查看有哪些表: SHOW TABLES; ...
- 第二百七十六节,MySQL数据库,【显示、创建、选定、删除数据库】,【用户管理、对用户增删改查以及授权】
MySQL数据库,[显示.创建.选定.删除数据库],[用户管理.对用户增删改查以及授权] 1.显示数据库 SHOW DATABASES;显示数据库 SHOW DATABASES; mysql - 用户 ...
- MySQL删除所有表的外键约束、禁用外键约束
转: MySQL删除所有表的外键约束.禁用外键约束 2017年10月27日 00:11:34 李阿飞 阅读数:4512 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- mysql 查询指定数据库所有表, 指定表所有列, 指定列所有表 所有外键及索引, 以及索引的创建和删除
查询指定 数据库 中所有 表 (指定数据库的,所有表) // 可以把 TABLE_NAME 换成 * 号, 查看更丰富的信息 SELECT TABLE_NAME FROM information_sc ...
- (转载)MySQL删除所有表的外键约束、禁用外键约束
其实如果想删除所有表可以直接如下操作: 在navicat中直接选中所有表,然后右键删除表即可,会有提示,一路确定,就会先删掉没有外键的表和字表,只要一路确定,删几批就把表都删完了,并不算太麻烦. 转: ...
- mysql如何添加一个表的外键
1:创建一个父表,主键作为子表的外键: create table province( pId int primary key auto_increment, pName varchar() ); 2: ...
- MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
随机推荐
- 简单模仿QQ聊天界面
首先看一下最终的效果,显示了消息时间,用户昵称,用户头像. 大致实现方法: 用最简单的ListView显示消息内容. 不同的用户使用不同的消息布局文件,从而达到头像左右显示的效果,如上图有2个用户&q ...
- golang中判断两个slice是否相等
在golang中我们可以轻松地通过==来判断两个数组(array)是否相等,但遗憾的是slice并没有相关的运算符,当需要判断两个slice是否相等时我们只能另寻捷径了. slice相等的定义 我们选 ...
- WebAPI 使用控制台启动
using System; using System.Web.Http; using System.Web.Http.SelfHost; namespace UAC_OAuth2Center { pu ...
- C# 方法递归
一.简介 方法递归就是自己调用自己. 未完结
- 第五次实验报告:使用Packet Tracer理解OSPF路由协议
目录 1 实验目的 2 实验内容 3. 实验报告 3.1 建立网络拓扑结构 4. 配置 4.1 配置并激活串行地址和以太网地址 4.1.1 R1 4.1.2 R2 4.1.3 R3 4.1.4 PC ...
- ORA-12528: TNS:listener: all appropriate instances are blocking new connections
Oracle问题:ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接 问题原始描述: ORA-12528: TNS:listener: all appropriate insta ...
- Vue.js 源码分析(十) 基础篇 ref属性详解
ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引用就指向组件实例,例如: ...
- Deep Learning专栏--FFM+Recurrent Entity Network的端到端方案
很久没有写总结了,这篇博客仅作为最近的一些尝试内容,记录一些心得.FFM的优势是可以处理高维稀疏样本的特征组合,已经在无数的CTR预估比赛和工业界中广泛应用,此外,其也可以与Deep Networks ...
- java中的7个位运算运算符
位运算指的是针对整数的二进制进行的位移操作. 位运算提供比算术运算更高的效率,但是位运算的代码可读性较差,建议所有使用位运算的地方写上注释. Java中提供7个位运算符用于位运算. 左移(<&l ...
- 数据库的dml、ddl和dcl的概念
学过数据库肯定会知道DML.DDL和DCL这三种语言,这种基础概念性的东西是必须要记住的. DML(Data Manipulation Lanaguage,数据操纵语言) DML就是我们经常用到的SE ...