5.6 数据库表关系

多对一或者一对多

格式:

constraint  起个名字 foreign key(关联字段) references 被关联表(被关联字段)
on delete cascade        # 是否联动删除
on update cascade       # 是否联动更新

示例:

  一个出版社可以出多本书    一对多

  一本书可以被多个出版社出版   一对多

代码:

  被关联表

create  table press(
id int primary key auto_increment,
name char(20)
);

  关联表

create table book(
book_id int primary key auto_increment,
book_name varchar(20),
book_price int,
press_id int,
constraint Fk_pressid_id foreign key(press_id) references press(id)
on delete cascade
on update cascade
);

详解

  FK 字段在关联表创建,会新增一个 FK字段 建立于被关联表的映射

  被关联表的被关联字段必须是唯一的,即多对一的 ""

  关联表的FK 字段是可以不唯一的, 即多对一的 ""

一对一

格式:

关联字段 类型 unique,  # 一对一的管理字段必须在关联表中唯一 

constraint  起个名字 foreign key(关联字段) references 被关联表(被关联字段)
on delete cascade        # 是否联动删除
on update cascade       # 是否联动更新

示例:

  管理员对于用户

    每个管理员都是一个用户 一对一关系

代码:

  被关联表

create table user(
id int primary key auto_increment, #主键自增
name char(10)
);

  关联表

create table admin(
id int primary key auto_increment,
user_id int unique,   # 唯一索引
password varchar(16),
foreign key(user_id) references user(id)  # 建立外键索引
on delete cascade
on update cascade
);

详解

  一对一关系基于 FK 的使用加上了 唯一索引来限制 ,从而实现两边都是唯一的索引

多对多

格式:

unique(关联字段1,关联字段2),  # 建立联合唯一 
constraint 起个名字 foreign key(关联字段) references 被关联表(被关联字段) on delete cascade # 是否联动删除 on update cascade # 是否联动更新

示例:

  书和作者的关系

   一个作者可以写多本书,一本书也可以有多个作者

    双向的一对多,即多对多

代码:

  被关联表1

create table book1(
id int primary key auto_increment,
name varchar(10),
price float(3,2)
);

  被关联表2

create table author(
id int primary key auto_increment,
name char(5)
);

  关联表

create table author2book(
id int primary key auto_increment,
book_id int not null,
author_id int not null,
unique(book_id,author_id),  # 建立联合唯一
foreign key(book_id) references book1(id)  # 对每个表进行外键关联
on delete cascade
on update cascade,

foreign key(author_id) references author(id)  # 对每个表进行外键关联on delete cascade on update cascade );

详解

  多对多的关系已经无法用两张表完成。必须多建立一张表用来存储关系字段的联系记录

  第三张表建立的时候要对两个表分别进行 FK 关联

  在插入数据的时候要对第三张表进行操作创建管理数据才可以实现多对多关系映射

  

原文地址:https://www.cnblogs.com/shijieli/p/10344499.html

时间: 2024-11-01 06:22:42

5.6 数据库表关系的相关文章

数据库表关系(一堆垛,多对多)

1.记住,永远记住:表与表之间关联的唯一手段就是外键 表与表之间相关联只能通过外键. 2.所以数据库表与表之间的,一对多,多对多关系.说白了就是怎样建立外键的关系,在哪个表建立外键. 通过外键维持各种表之间的关系. 3. 6 表与表之间的关系 l 一对一:例如t_person表和t_card表,即人和身份证.这种情况需要找出主从关系,即谁是主表,谁是从表.人可以没有身份证,但身份证必须要有人才行,所以人是主表,而身份证是从表.设计从表可以有两种方案: 在t_card表中添加外键列(相对t_use

数据库表关系及配置

1.数据库表中的关系 一对一 一对多(多对一) 多对多 2.如何确立和实现数据库中的表关系 一对多的表关系实现: 使用外键约束 我们习惯把一的方称为主表,把多的方称为从表 外键:从表中有一列,除了null之外,只能来源于主表的主键 默认情况下,外键的字段是可以重复的 多对多的表关系在数据库中实现: 使用中间表 中间表有两个外键,引用两个多对多表的主键 不能有其它字段信息,至于中间表的主键,应该采用联合主键 任何一个多方表和中间表去比较都是一对多的关系 一对一的表关系再数据库中实现: 有两种: 1

数据库 表关系设计参考

表关系设计 出版社表关系 # 出版社表 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

数据库表关系:多对多的三中方式

1.第一种django orm在创建表的时候自动帮我们创建表关系 from django.db import models # Create your models here. #创建book表 class Book(models.Model): name=models.CharField(max_length=32) # 第一种方式,系统帮我们自动创建了表book与表author关系 authors=models.ManyToManyField(to='Author') #创建作者表 clas

Sonar 数据库表关系整理一(续)

简介:Sonar平台是目前较为流行的静态代码扫描平台,为了便于使用以及自己二次开发,有必要对它的数据库结构进行学习和理解. 如题,目前网络上搜不到相关内容,只能自己慢慢整理,作为资料,以备查询. ========================================================================================= 查询某个月被扫描到的最多的规则: SELECT i.rule_id,r.name AS rulename,COUNT(*)

在Entity Framework 中实现继承关系映射到数据库表

继承关系映射到数据库表中有多种方式: 第一种:TPH(table-per-hiaerachy) 每一层次一张表 (只有一张表) 仅使用名为父类的类型名的一张表,它包含了各个子类的所有属性信息,使用区分列(Disciriminator column)(通常内容为子类的类型名)来区分哪一行表示什么类型的数据. 第二种:TPT(Table-per-type) 每种类型都有一张表(父类及每个子类都有表) 父类.各子类各自都有一张表.父类的表中只有共同的数据,子类表中有子类特定的属性.TPT很像类的继承结

django之模型类、迁移和数据库表之间的关系

环境配置:ubuntu 16.04,Django 1.8.2,MySQL-python 1.2.5 目的是为了了解模型类的定义和其对应数据库里面表的关系 实测发现: 关于模型类和数据库里面的表关系,模型类里面定义的类属性是为了生成数据库里面的表结构使用的,类似mysql里面创建一个表. 一个模型类,对应着数据库里面的一个表. 一个类属性,对应着数据库表里面的一个字段 一个类属性的类型(如charfield),对应着数据库里面字段类型. 进入python manage.py shell运行的pyt

数据库之表关系

一 表的详细操作 1.修改表名 alter table 旧表名 rename 新表名: 2.修改表中的引擎与字符编码 alter table 表名 engine = "引擎名" charset ="编码名": 3.复制表 #3.1只复制表结构以及约束条件 create table 新表名 like 旧表名: eg1: select * from t1; +----+------------+ | id | name | +----+------------+ | 0

数据库多表关系(外键)

数据库多表关系(外键) 字段操作 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