我的问题归结为“连接表 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/