Hzangyao

导航

MySQL中表之间的关系和约束条件

一对多关系


# 如何判断表关系
'''一对多的判断?'''
以图书表和出版社表为例
	1. 站在两张表的角度,分别问一个问题,一本图书能不能有多个出版社?不能
    2. 一个出版社能不能有多个图书?能
    '''
    	结论:如果一个能,一个不能,那么表关系就是'一对多'
    	针对一对多的关系,外键字段健在多的一方
    '''
	1 一对多表关系,外键字段建在多的一方
    2 在创建表的时候 一定要先建被关联表
    3 在录入数据的时候 也必须先录入被关联表
# 被关联表
create table dep(
	id int primary key auto_increment,
    dep_name char(16),
    dep_desc char(32)
)

create table emp(
	id int primary key auto_increment,
    name char(16),
    gender enum('male','female') default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)
)

#级联更新on update cascade   级联删除on delete cascade
create table dep(
	id int primary key auto_increment,
    dep_name char(16),
    dep_desc char(32)
);

create table emp(
	id int primary key auto_increment,
    name char(16),
    gender enum('male','female') default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id) 
    on update cascade #同步更新
    on delete cascade #同步删除
);
insert into dep(dep_name,dep_desc) values('教学部','教书育人'),('技术部','技术能力有限');

多对多关系

以图书和作者表为例
	1. 站在图书表角度
    	问:一个图书能否有多个作者写?
        答:可以
    2. 站在作者表的角度
    	问:一个作者能否写多本书
        答:可以
     '''
     	结论:如果两边都可以,那么,表关系就是多对多
     	针对,多对多关系,外键字段不健在任何一方
     	而是,健在第三张表中
     	
     '''
书名表和作者表,再额外创建一个id表关联它们
create table book(
    id int primary key auto_increment,
    title varchar(32),
    price int
);

create table author(
    id int primary key auto_increment,
    name varchar(32),
    age int
);

create table book2author(
    id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(author_id) references author(id) 
    on update cascade 
    on delete cascade,
    foreign key(book_id) references book(id) 
    on update cascade 
    on delete cascade
);

insert into book(title,price) values('jpm',6699),('lzzy',9966),('tpt',5555);

insert into author(name,age) values('jason',99),('egon',88);

一对一

'''一对一关系判断'''
以作者表和作者详情表为例
	1. 站在作者表角度
    	问:一个作者能否有多个作者详细?
        答:不可以
    2. 站在作者详情表的角度
    	问:一个作者详情能否有多个作者
        答:不可以
        '''
        	结论:两边都不能,那就是一对一,或这没有关系
        	针对,一对一关系,外键字段健在任何一方都可以,推荐在使用频率比较高的一张表
        '''
信息表和详情表,每个人只能对应一个详情
create table people(
	id int primary key auto_increment,
    name varchar(16),
    age int,
    message_id int unique,
    foreign key(message_id) references message(id)
    on update cascade
    on delete cascade
);

create table message(
	id int primary key auto_increment,
    QQ int,
    weixin int,
    addr varchar(50)
);
 insert into message(QQ,weixin,addr) values(127,127,'shanghai'),(135,135,'wuhan');
    
 insert into people(name,age,message_id) values('ly',18,1),('lw',22,2);

约束条件

zerofill 用0填充空的位置
unsigned 去掉负数,也就是相当于给正整数长度127*2
default 默认值
unique  唯一
not null 非空
primary key  主键
auto_increment 自增  通常配合主键使用

posted on 2022-03-02 20:10  Hzangyao  阅读(61)  评论(0编辑  收藏  举报