mysql基础-6.一对一关系

案例:用户与用户详情的关系

一对一的使用常见一般是

有一张常用字段的表,还有一张不怎么常用字段的表,例如

用户表

id用户名年龄
1枫枫23
2zhangsan18

用户详情表

user_id地址爱好手机号邮箱
1湖南长沙唱跳rap12542244123@qq.com

要实现,通过用户查用户详情,通过用户详情查用户

这样如何表示呢?

表结构定义

和定义一对多关系类似

但是一对多的外键只能在多的那张表上

比如学生和班级,学生是多的,班级是1,外键只能在学生表上

但是一对一的外键可以在不同位置

外键在用户表

create table user
(
    id           int(11)     NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name         varchar(16) not null,
    age          int(16) default 18,
    user_info_id int(11)     null unique , # 要设置不能重复
    FOREIGN KEY (user_info_id) REFERENCES userinfo (user_id) on delete set null # 设置外键约束
);
create table userinfo
(
    user_id int(11)     NOT NULL PRIMARY KEY,
    `like`  varchar(16) null,
    `addr`  varchar(32),
    `tel`   varchar(11),
    `email` varchar(32)
);

外键在用户信息表

create table user
(
    id     int(11)     NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name   varchar(16) not null,
    age    int(16) default 18
);
create table userinfo
(
    user_id int(11)     NOT NULL PRIMARY KEY,
    `like`  varchar(16) null,
    `addr`  varchar(32),
    `tel`   varchar(11),
    `email` varchar(32),
    FOREIGN KEY (user_id) REFERENCES user (id) on delete cascade # 设置外键约束
);

注意,两种情况下用的外键删除逻辑是不一样的

第一种情况

外键在用户表,删除用户信息,肯定不能把用户删掉,只能把用户关于这个外键的数据设置为null

第二种情况

外键在用户信息表,删除用户表,这个用户信息就没用了,可以级联删除

一般来说,一对一的外键是在常用表里面

数据写入

使用第一种情况

# 先把用户详情数据加入
insert into userinfo(user_id, `like`, addr, tel, email)value (1, '唱跳rap', '湖南长沙', '126545', '12324@qq.com');
# 用户关联用户详情
insert into user(`name`, age, user_info_id) value ('枫枫', 18, 1);

数据查询

# 查枫枫的爱好
select `like`from userinfo where user_id = (select id from user where name = '枫枫');

select name, `like` from user join userinfo  on user.id = userinfo.user_id  where name = '枫枫';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值