对一些人来说,这可能是一个非常简单的问题,但我发现很难理解。
场景:我正在使用一个学校数据库。我有一个表,它将一个类与一个名为"subject_class"的主题联系起来。
一个类可以是多个主题的一部分,一个主题可以包含多个类。根据我的理解,这是一个表中的多对多关系。
数据库外观示例:
subject_id class_id
1 14
1 15
2 14
*1 *14
正如您所看到的,相同的数据可以多次输入到表中(上面用星号显示)。我希望这种事停止发生。我的问题是,这是什么样的钥匙?为什么?或者我该如何阻止问题的发生?
我希望这是有意义的,如果没有,请告诉我,我会提供更多信息。
提前谢谢。
您希望subject_id和class_id上有一个唯一的键,以防止重复。但你需要确保你的应用程序可以:处理当你试图插入一个已经存在的值组合时抛出的错误,并从一开始就试图防止它提交重复的值。
或者,如果您希望后续插入覆盖现有条目,则应查看数据库软件是否可以处理"ON DUPLICATE KEY UPDATE"。
您几乎只需要将一个UNIQUE
应用于两列。一般流程如下:应用程序尝试保存关系,而不在操作之前进行验证,并等待数据库的答复。在重复的情况下,插入会返回一个错误,应该在应用程序中进一步处理。
您想要一个唯一的键,跨越两行:这样两列每个都可以有非唯一的数据,但不能在组合中
ALTER TABLE subject_class ADD UNIQUE INDEX sanity (subject_id, class_id);
在两个字段之间创建主键
ALTER TABLE subject_class ADD PRIMARY KEY (subject_id, class_id)
但是在添加索引之前,您需要删除重复项。
如果您在使用的应用程序编程语言中验证它,效果会更好。在将insert-in更新到数据库之前,请应用检查。
在数据库级别,您可以使用复合唯一密钥。唯一地识别一行。
alter table subject_class ADD UNIQUE INDEX sanity (subject_id, class_id);
在两个字段上添加一个UNIQUE。
ALTER TABLE `table` ADD UNIQUE ( `subject_id` , `class_id` ) ;