这应该是什么样的关键?

时间:2012-02-08 00:16:53

标签: database key

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

场景: 我正在使用学校数据库。 我有一个表,它将一个类与一个名为'subject_class'的主题联系起来。

一个类可以是多个主题的一部分,一个主题可以包含多个类。所以从我的理解来看,这是一个表中的多对多关系。

数据库外观的一个示例:

subject_id          class_id
    1                 14
    1                 15
    2                 14
    *1                *14

如您所见,可以多次将相同的数据输入到表格中(如上图所示,带有星号)。我希望这种情况不再发生。我的问题是,这将是什么样的关键?为什么?或者我怎么能阻止问题发生?

我希望这是有道理的,如果没有,请告诉我,我会提供更多信息。

提前致谢。

6 个答案:

答案 0 :(得分:3)

您可能希望在subject_id和class_id上拥有唯一键以防止重复。但您需要确保您的应用程序可以:处理在您尝试插入已存在的值组合时引发的错误,并尝试防止它首先提交重复项。

或者,如果您希望后续插入覆盖现有条目,您应该查看您的数据库软件是否可以处理ON DUPLICATE KEY UPDATE。

答案 1 :(得分:0)

您需要的只是一个UNIQUE应用于两列。一般流程如下:应用程序尝试保存关系而不在操作之前进行验证并等待数据库答案。如果出现重复,插入会返回错误,应在应用程序中进一步处理。

答案 2 :(得分:0)

您想要一个跨越两行的唯一键:这样,每个列都可以包含非唯一数据,但组合

ALTER TABLE subject_class ADD UNIQUE INDEX sanity (subject_id, class_id);

答案 3 :(得分:0)

如果您使用正在使用的应用程序编程语言验证它,那就更好了。在更新插入数据库之前应用检查。

在数据库级别,您可以使用复合唯一键。单独识别行。

alter table subject_class ADD UNIQUE INDEX sanity (subject_id, class_id);

答案 4 :(得分:0)

在两个字段中创建主键

ALTER TABLE subject_class ADD PRIMARY KEY (subject_id, class_id)

但您需要删除重复项才能添加索引。

答案 5 :(得分:-1)

在两个字段上添加UNIQUE。

ALTER TABLE `table` ADD UNIQUE (  `subject_id` ,  `class_id` ) ;