多表关系一对一

多表关系一对一

一、多表关系

外键:建立表与表关联 的字段,通常 一个表的外键 是 另一个表的主键(唯一键也可以)

  1. 一对一关系:外键在任何一方都可以,此时外键要设置 唯一键
  2. 一对多关系:外键必须放在多的一方,此时外键值不唯一
  3. 多对多关系:一定要创建第三张表(关系表),每一个外键值不唯一,可以多个外键建立联合唯一

二、一对一无级联关系

  1. 创建数据库
# 作者详情(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 in 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)
);
  1. 插入数据关联表(author)和被关联表(author_detail)

必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据

# 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据
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);
  1. 修改关联表(author)和被关联表(author_detail)
# 修改关联表 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_detail
mysql>: update author_detail set id=10 where id=1;  # 无法修改
  1. 删除关联表(author)和被关联表(author_detail)
# 删除关联表 author
mysql>: delete from author where detail_id=3;  # 直接删除
# 删除被关联表 author_detail
mysql>: delete from author_detail where id=1;  # 无法删除

没有级联关系下:

  • 增加:先增加被关联表记录,再增加关联表记录
  • 删除:先删除关联表记录,再删除被关联表记录
  • 关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

三、一对一有级联关系

  1. 创建数据
# 作者详情(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
);
  1. 插入数据关联表(author)和被关联表(author_detail)

必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据

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);
  1. 修改关联表(author)和被关联表(author_detail)
# 修改关联表 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; # 有未被其他数据关联的数据,就可以修改

# 修改被关联表 author_detail
mysql>: update author_detail set id=10 where id=1;  # 级联修改,同步关系关联表外键
  1. 删除关联表(author)和被关联表(author_detail)
# 删除关联表 author
mysql>: delete from author where detail_id=3;  # 直接删除

# 删除被关联表 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;  # 可以删除,将关联表的记录级联删除掉

原文地址:https://www.cnblogs.com/randysun/p/11629808.html

时间: 2024-11-05 11:53:55

多表关系一对一的相关文章

表关系(一对一,一对多,多对多)

可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的. 在一个关系型数据库中,利用关系可以避免多余的数据.例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles 的表,它用来存储有关每本书的信息,例如书名.出版日期和出版社.您也可能保存有关出版社的信息,诸如出版社的电话.地址和邮政编码.如果您打算在 titles 表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码. 更好的方法是将有关出版社的信息在单独的表,publ

字段操作与多表关系

字段操作 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 ''; # 增加 mysql>: alter table 表名 add 字段名 类型[(长度) 约束]; # 末尾 eg>: alter table tf1 add

数据库多表关系(外键)

数据库多表关系(外键) 字段操作 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 ''; # 增加 mysql>: alter table 表名 add 字段名 类型[(长度) 约束]; # 末尾 eg>: alter t

058:表关系之一对一

表关系之一对一应用场景: 比如一个用户表和一个用户信息表.在实际网站中,可能需要保存用户的许多信息,但是有些信息是不经常用的.如果把所有信息都存放到一张表中可能会影响查询效率,因此可以把用户的一些不常用的信息存放到另外一张表中我们叫做UserInfo.但是用户表User和用户信息表UserInfo就是典型的一对一了. 实例代码如下: # models.py文件内容: class User(models.Model): username = models.CharField(max_length=

mysql表的一对一/一对多/多对多联系

1.数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多. 2.通过表的关系,来帮助我们怎样建表,建几张表. 一对一 一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然. 学生表:姓名,性别,年龄,身高,体重,籍贯,家庭住址,紧急联系人 其中姓名.性别.年龄.身高,体重属于常用数据,但是籍贯.住址和联系人为不常用数据 如果每次查询都是查询所有数据,不常用的数据就会影响效率,实际又不用 常用信息表:ID(P),姓名,性别,年龄,身高,体重 不常用信息表:ID(

Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理

Php Laravel框架 多表关系处理 之 Eloquent一对多关系处理 本博文主要介绍 Laravel 框架中 Eloquent  对一对多关系的处理,在 Laravel Administrator(后台扩展包) 您的数据库可能是彼此相关的.比如,一篇博客文章可能有许多评论,或者一个订单与下订单的用户相关.Eloquent 使得管理和处理这些关系变得简单.Laravel 提供了四种类型的关系: -一对一 -一对多 - 多对多 - 多态关系 一对多 一个一对多关系的例子是一篇博客文章有许多评

Hibernate框架进阶(中篇)之多表关系

导读 Hibernate进阶主要分为上中下三篇,本文是中篇,主要讲解Hibernate框架中多表关系的实现.我们知道多表关系有一对一.一对多(多对一)和多对多三种关系.而1对1关系一般合并为一个表处理,所以本文主要讲解1对多和多对多关系的实现. 一.一对多关系 一对多的关系很多,比如人和籍贯就是一对多的关系,下面就用人和籍贯这个实例来展开说明. 1.数据库的实现 对于一对多关系的建立,我们通常是使用外键(foreign key)来表示.外键列添加在一对多的"多"这一方.这里用perso

django-创建表的字段属性,表关系

表的各种属性文档:null char ..., django与之对应的文档 https://docs.djangoproject.com/en/1.11/ref/models/fields/   英文 https://yiyibooks.cn/xx/Django_1.11.6/ref/models/fields.html     中文 表关系 class Book(models.Model): headline = models.CharField('大标题', max_length=50) p

数据库 表关系设计参考

表关系设计 出版社表关系 # 出版社表 class Publisher(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=128) phone = models.IntegerField() def __str__(self): return self.name # 作者表 class Author(models.Model): name = models.CharFi