将外键和检查约束应用于 MySQL 表



我的问题可以归结为"连接表 B 是否可以对表 A 中不是外键的值进行检查约束?对同一外键的多次引用可能会使情况进一步复杂化。我正在努力解决的特定场景在下面详细介绍了一些缩写的MySQL代码。

MySQL数据库包含表"无序"(如下所示(:

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

  • 第二列"疾病"是引用Disorder.disorder_name的外键。只允许在此处输入Disorder.disorder_type="疾病"的disorder_names。

  • 第三列"综合征"是引用Disorder.disorder_name的外键。只允许在此处输入Disorder.disorder_type="综合症"的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",如果您有唯一值,则"唯一=真"这将处理空列。现在,您必须在添加数据时在应用程序逻辑中实现 rest,您必须了解"疾病类型"等标准。但是当你从数据库中读取时,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/

最新更新