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 来指定外键是否唯一。

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

相关推荐
Oueii24 分钟前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
未来龙皇小蓝1 小时前
【MySQL-索引调优】11:Group by相关概念
数据库·mysql·性能优化
2401_831824961 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
njidf1 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
twc8291 小时前
大模型生成 QA Pairs 提升 RAG 应用测试效率的实践
服务器·数据库·人工智能·windows·rag·大模型测试
@我漫长的孤独流浪1 小时前
Python编程核心知识点速览
开发语言·数据库·python
2401_851272991 小时前
实战:用Python分析某电商销售数据
jvm·数据库·python
枕布响丸辣1 小时前
MySQL 从入门到精通:完整操作手册与实战指南
数据库·mysql
电商API&Tina2 小时前
【电商API接口】开发者一站式电商API接入说明
大数据·数据库·人工智能·云计算·json
2401_857918292 小时前
用Python和Twilio构建短信通知系统
jvm·数据库·python