mysql - 对 MySQL 表应用外键和检查约束

标签 mysql foreign-keys constraints check-constraints

我的问题归结为“连接表 B 是否可以受到针对表 A 中非外键的值的检查约束?”。由于多次引用同一个外键,情况可能会变得更加复杂。下面通过一些简短的 MySQL 代码详细介绍了我遇到的具体场景。

MySQL 数据库包含表“Disorder”(如下所示):

CREATE TABLE `Disorder` (
disorder_name VARCHAR(255),
disorder_type VARCHAR(10),
PRIMARY KEY(`disorder_name`)
)

疾病类型可以是“综合症”或“疾病”。疾病和证候可以以多对多的方式联系起来(例如,多种疾病可以引起相同的证候,相同的疾病可以引起不同的证候)。

我希望创建一个名为“DiseaseSyndromeLink”的联接表,显示“疾病”病症与“综合症”病症之间的关系。

CREATE TABLE `DiseaseSyndromeLink` (
`ds_id` int NOT NULL AUTO_INCREMENT,
    `disease` VARCHAR(255) NOT NULL,
`syndrome` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`ds_id`),
    FOREIGN KEY (disease) REFERENCES disorder(disorder_name),
    FOREIGN KEY (syndrome) REFERENCES disorder(disorder_name)
)

该表需要设计起来很棘手的约束:

  • 第一列是一个整数连接 ID

  • 第二列“Disease”是引用 Disorder.disorder_name 的外键。仅允许在此处输入 Disorder.disorder_type='Disease' 的disorder_names。

  • 第三列“Syndrome”是引用 Disorder.disorder_name 的外键。仅允许在此处输入 Disorder.disorder_type='Syndrome' 的disorder_names。

我觉得语法应该是这样的:

CREATE TABLE `DiseaseSyndromeLink` (
`ds_id` int NOT NULL AUTO_INCREMENT,
`disease` VARCHAR(255) NOT NULL,
`syndrome` VARCHAR(255) NOT NULL,
PRIMARY KEY (`ds_id`),
FOREIGN KEY (disease) REFERENCES disorder(disorder_name) WHERE (Disorder.disorder_type='Disease'),
FOREIGN KEY (syndrome) REFERENCES disorder(disorder_name) WHERE (Disorder.disorder_type='Syndrome')
)    

我的理解是检查值(例如='Disease')需要检查约束,而链接到原始表需要外键约束。我找不到任何文档或 YouTube 教程详细说明同时使用这两个约束。由于很难找到这段代码的任何示例,我想知道我是否在数据库设计方面犯了错误,但想不出一个好的替代方案。

检查和外键约束可以这样一起使用吗?

感谢您的宝贵时间!

问题已编辑为最初包含有关尝试在 DJANGO 方面强制执行此关系的信息。

最佳答案

据我所知,您的 MYSQL 语句有点有效,因此您所需要做的就是以与您相同的方式将外键添加到模型中。虽然这一次,您将设置“null=True”,并且如果您有唯一值,则“unique=True”这将处理空列。现在,您必须在添加数据时在应用程序逻辑中实现休息,您必须了解“疾病类型”等标准。但是当你从数据库读取时Django会自动预取相关的。读取数据的示例查询。

data=Diseasesyndromelink.objects.filter(disease__feild="query")
print(data.disease) #your foreign key object is prefetched here already.

查看文档以获取更多示例。 https://docs.djangoproject.com/en/3.0/topics/db/models/

关于mysql - 对 MySQL 表应用外键和检查约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59775978/

相关文章:

mysql - 如何处理 mysql 中特定约束的错误?

sql - 像数据库行的引用计数或共享指针之类的东西?

java - 将约束添加到仅包含 Java 列表中的第一个对象的字段

mysql - 如何向 MySQL 中的整数列添加正整数约束?

php - 如何在 2 个查询之间共享 connection_id?

php - 电子邮件未从 mysql 数据库表中的行中获取用户名字

mysql - 当元组的一部分在另一个表中使用时,无法删除关系表中的元组(但整个元组不在该其他表中)

ios - 自定义 UIView 一开始仅覆盖屏幕的一部分

python - 超过锁等待超时;尝试使用 python 更新 mysql 表时尝试重新启动事务'错误

MYSQL 创建带有外键的表产生错误