表之间的关系

表之间的关系

一、字段的操作

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信息也会被随之删除
"""
posted @ 2019-09-24 21:41  RandySun  阅读(349)  评论(0编辑  收藏  举报