mysql的外键

MySQL 中的外键是一种关系型数据库特性,用于在两个表之间建立关联。外键定义了一个表中的列(或多列)与另一个表中的数据的关系,通常是通过主键和外键之间的关联。在 Django 的模型中,外键通过 models.ForeignKey 字段来表示。

主表和从表: 在两个表中,包含外键的表被称为主表,被引用的表是从表。

主键和外键: 主表中的列通常是主键,而从表中的列则是外键,它与主表的主键相对应。

定义外键:

在 Django 模型中,可以通过 models.ForeignKey 字段来定义外键models.ForeignKey 用于创建一个多对一(Many-to-One)的关系。它允许一个模型通过外键与另一个模型建立关联。在 MySQL 中,这通常通过在一个模型中存储另一个模型的主键来实现。

复制代码
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

在这个例子中,我们有两个模型:Author 和 Book。Book 模型有一个外键 author,它与 Author 模型建立了关联。下面是一些关键概念:

ForeignKey 字段类型: models.ForeignKey 用于创建一个外键字段。它指定了与之关联的模型(这里是 Author)

on_delete 参数: 外键字段还有一个必需的参数 on_delete,它指定了在关联的对象被删除时采取的行为。常用的选项包括:

models.CASCADE: 当关联的对象被删除时,与之相关的所有对象也被删除。
数据库的级联删除

models.PROTECT: 阻止删除关联的对象,抛出 ProtectedError 异常。

models.SET_NULL: 将所有关联的外键字段设置为 NULL。要使用此选项,外键字段必须允许 NULL 值。

models.SET_DEFAULT: 将所有关联的外键字段设置为默认值。

models.SET(): 将所有关联的外键字段设置为特定的值。

models.DO_NOTHING: 什么都不做。

在上面的例子中,on_delete=models.CASCADE 表示当与之关联的 Author 对象被删除时,相关的 Book 对象也会被删除。

使用外键,你可以通过查询轻松地获取相关对象,例如:

复制代码
# 获取某本书的作者
book = Book.objects.get(id=1)
author = book.author

这使得在数据库中建立和管理模型之间的关系变得更加容易。

related_name 是一个可选的参数,用于设置反向关系的名称。具体而言,它定义了从关联的模型反向查询时使用的名称。

复制代码
class Article(models.Model):
column = models.ForeignKey(
    ArticleColumn,
    null=True,
    blank=True,
    on_delete=models.CASCADE,
    related_name='article'
)

这里的 related_name='article' 意味着你可以通过 ArticleColumn 模型的实例直接访问与之相关的 ArticlePost 对象。例如,如果你有一个 column 实例,你可以使用 column.article.all() 获取与该栏目相关的所有文章。

复制代码
my_column = ArticleColumn.objects.get(id=1)
related_articles = my_column.article.all()

这使得在模型之间进行反向查询更加方便,并且提供了更具有可读性的名称,而不是默认的 articlepost_set。

外键的作用:

维护数据一致性: 外键确保从表中的数据与主表中的数据保持一致,防止了不一致的情况。

建立关联: 外键建立了两个表之间的关联,使得它们在逻辑上形成了一种关系。

唯一性约束: 可以通过 unique=True 来指定外键是否唯一。

索引: 外键通常会自动创建索引,以提高查询性能。

相关推荐
陈卓41024 分钟前
MySQL-主从复制&分库分表
android·mysql·adb
IT项目管理1 小时前
达梦数据库DMHS介绍及安装部署
linux·数据库
你都会上树?1 小时前
MySQL MVCC 详解
数据库·mysql
大春儿的试验田1 小时前
高并发收藏功能设计:Redis异步同步与定时补偿机制详解
java·数据库·redis·学习·缓存
Ein hübscher Kerl.2 小时前
虚拟机上安装 MariaDB 及依赖包
数据库·mariadb
长征coder2 小时前
AWS MySQL 读写分离配置指南
mysql·云计算·aws
醇醛酸醚酮酯2 小时前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
ladymorgana3 小时前
【docker】修改 MySQL 密码后 Navicat 仍能用原密码连接
mysql·adb·docker
PanZonghui3 小时前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql
GreatSQL社区3 小时前
用systemd管理GreatSQL服务详解
数据库·mysql·greatsql