这应该是什么样的钥匙



对一些人来说,这可能是一个非常简单的问题,但我发现很难理解。

场景:我正在使用一个学校数据库。我有一个表,它将一个类与一个名为"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` ) ;

最新更新