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

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

相关推荐
收纳过往12 分钟前
数据库加索引的时机:慢查询日志说话
android·开发语言·数据库·python·低代码·rxjava
咖啡八杯20 分钟前
Redis 工具封装:RedisCache 对 Operations 体系的二次封装
java·数据库·redis·缓存·框架·springboot·若依
PaperData21 分钟前
2000-2025年地级市科技支行设立数据
数据库·科技
实泽有之,无泽虚之28 分钟前
ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务问题原因及解决办法
数据库·oracle
牧瀬クリスだ43 分钟前
Redis Hash实战:高效存储对象与购物车
java·数据库·redis·算法·哈希算法
A小码哥1 小时前
【外】水星3号实测 1068 token 每秒靠谱吗
数据库
秋饼1 小时前
MySQL 分库分表完全指南:ShardingSphere-JDBC 实战、分片键选型、场景边界、20 个生产坑与 30 道面试点
java·mysql·面试·shardingsphere·分库分表·后端架构
qq_452396231 小时前
第六篇:《SQL 优化的艺术:从慢查询到毫秒级响应》
数据库·sql
ShineWinsu1 小时前
对于Qt:QWidget通用属性的解析—上
数据库·qt·microsoft·面试·gui·属性·qwidget
程序员塔塔喵1 小时前
【MySQL篇|第十篇】深分页问题
数据库·oracle·深分页问题