表之间的关系
表之间的关系
一、字段的操作
create table test(
id int primary key auto_increment,
name char(10) unique,
age int unsigned default 0
);
# 修改字段类型
alter table 表名 modify 字段名 字段类型[长度] 约束条件;
alter table test modify name varchar(16) unique;
# 修改字段名
alter table 表名 change 旧字段名 新字段名 字段类型[长度] 约束条件;
alter table test change name new_name varchar(18) unique;
# 默认在表字段最后增加字段
alter table 表名 add 新字段名 字段类型[长度] 约束条件; # 末尾
alter table test add sex enum('男', '女') default '男';
# 在所有字段之前添加
alter table 表名 add 新字段名 字段类型[长度] 约束条件 first; # 首位
alter table test add height float(7, 2) default 0 first;
# 在某个字段之后添加字段
alter table 表名 add 新字段名 字段类型[长度] 约束条件 after 字段名;# 某字段之后
alter table test add weight float(7, 2) default 0 after height;
# 删除字段
alter table 表名 drop 字段名;
alter table test drop height;
二、多表之间的关系
"""
一对一:丈夫-妻子,用户-身份证,作者-作者详情
一对多:部门-员工,班级-学生,书-出版社
多对多:老师-班级,课程-学生,出版社-作者
"""
# 书 - 出版社 - 作者 - 作者详情 外键分布
# 外键是 建立表与表关联 的字段,通常 一个表的外键 是 另一个表的主键(唯一键也可以)
# 一对一:**外键在任何一方都可以,此时外键要设置 唯一键**
"""
作者(author):id,name,sex,age,mobile
作者详情(author_detail): id,info,address,author_id
----------------------------------------------------
作者(author):id,name,sex,age,mobile, detail_id
1 Tom 1
2 Bom 2
3 Bob 3
作者详情(author_detail): id,info,address
1 Tom_info
2 Bom_info
"""
# 一对多:**外键必须放在多的一方,此时外键值不唯一**
"""
书(book):id,name,price,publish_id
1 西游记 1
2 东游记 2
3 西厢记 1
4 流浪记 1
出版社(publish): id,name,address,phone
1 老奶奶出版社
2 小奶奶出版社
"""
# 多对多:**一定要创建第三张表(关系表),每一个外键值不唯一,看可以多个外键建立联合唯一**
"""
作者(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
"""
三、外键
# 作者(author):id,name,sex,age,mobile, detail_id
# 作者详情(author_detail): id,info,address
# 1、外键的 字段名 可以自定义(名字随意),通常命名规范(关联表_关联字段)
# 2、外键要通过 foreign key 语法建立表与表之间的关联
# 3、foreign key(所在表的外键字段) references 关联表(关联字段)
# eg:foreign key(detail_id) references author_detail(id)
# 4、级联关系
# 级联更新 on update cascade
# 级联删除 on delete cascade
# 重点:外键字段本身可以唯一或不唯一,但是外键关联的字段一定唯一
四、一对一无级联关系
# 不是级联关系
# 作者详情(author_detail): id,info,address
create table author_detail(
id int primary key auto_increment,
info varchar(255),
address varchar(255)
);
# 作者表id,name,sex,age,mobile, detail_id
# 被关联表的必须先要创建
create table author(
id int primary key auto_increment,
name varchar(18) unique not null,
sex enum('男','女') default '男',
age int default 0,
mobile char(18) unique not null,
detail_id int unique not null,
foreign key(detail_id) references author_detail(id)
);
# 插入数据必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据
mysql>: insert into author(name, mobile,detail_id) values('tom',"123456", 1); # 报错 ERROR 1452 (23000):
mysql>: insert into author_detail(info, address) values('tom_info', 'tom_address');
mysql>: insert into author(name, mobile,detail_id) values('tom',"123456", 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; # 没有被其他数据关联的数据可以修改
mysql>: update author set detail_id=3 where detail_id=1; # 报错
# 删除关联表 author
mysql>: delete from author where detail_id=3; # 可以删除,关联的表
# 修改被关联表 author_detail
mysql>: update author_detail set id=10 where id=1; # 无法修改,
mysql>: update author_detail set id=10 where id=2; # 可以修改
# 删除被关联表 author_detail
mysql>: delete from author_detail where id=1; # 不可以删除
"""
没有级联的关系下:
增加:先增加被关联表记录(author_detail),在增加关联表记录(author)
删除:先删除关联表记录,在删除被关联表记录
修改:关联与被关联表都无法完成,关联的外键和主键 数据更新-(如果被关联表记录没有被绑定,可以被修改)
"""
mysql> desc author_detail;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| info | varchar(255) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> desc author;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(18) | NO | UNI | NULL | |
| sex | enum(' | YES | | | |
| age | int(11) | YES | | 0 | |
| mobile | char(18) | NO | UNI | NULL | |
| detail_id | int(11) | NO | UNI | NULL | |
+-----------+-------------+------+-----+---------+----------------+
6 rows in set, 2 warnings (0.01 sec)
五、一对一有级联关系
# 作者详情(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(18) unique not null,
sex enum('男','女') default '男',
age int default 0,
mobile char(18) unique not null,
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详情不存在
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; # 有未被其他数据关联的数据,就可以修改
# 删除关联表
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; # 可以删除,将关联表的记录级联删除掉
"""
增加:必须要先对关联表插入信息,才可以对被关联表插入信息
修改:修改关联表 author的外键,必须是在author_detail主键没有被关联才可以被修改
修改被关联表 author_detail主键,author外键也会随之改变
删除:
关联表author删除,不会影响到被关联表信息
删除被关联表author_detail,关联表author信息也会被随之删除
"""
六、表一对多关系
# 一对多:外键必须放在多的一方,此时外键值不唯一
# 出版社-书------>一对多的关系
# 出版社(publish): id,name,address,phone
create table publish(
id int primary key auto_increment,
name varchar(10),
address varchar(255),
phone char(10)
);
# 书(book):id,name,price,publish_id, author_id
create table book(
id int primary key auto_increment,
name varchar(20) 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
('xi', 6.66, 1),
('dong', 8.66, 1),
('python', 2.66, 7),
('java', 3.66, 8),
('c', 88.88, 9);
# 没有被关联的字段,插入依旧错误
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;
"""
增加:必须先publish关联表,插入数据,然后被关联表在插入数据
更新:修改关联表 book的外键,必须是在publish主键没有被关联才可以被修改
修改被关联表 publish主键 book中外键也会随之改变
删除:
关联表publish删除,被关联表也会被删除
删除被关联表book,关联表author信息也会被随之删除
"""
在当下的阶段,必将由程序员来主导,甚至比以往更甚。