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

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

相关推荐
奶糖趣多多44 分钟前
Redis知识点
数据库·redis·缓存
CoderIsArt2 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧4 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
Channing Lewis5 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
追风林5 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
毕业设计制作和分享6 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil276 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk7 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境7 小时前
第02章 MySQL环境搭建
数据库·mysql