对某些人来说,这可能是一个非常简单的问题,但我发现很难理解。
场景: 我正在使用学校数据库。 我有一个表,它将一个类与一个名为'subject_class'的主题联系起来。
一个类可以是多个主题的一部分,一个主题可以包含多个类。所以从我的理解来看,这是一个表中的多对多关系。
数据库外观的一个示例:
subject_id class_id
1 14
1 15
2 14
*1 *14
如您所见,可以多次将相同的数据输入到表格中(如上图所示,带有星号)。我希望这种情况不再发生。我的问题是,这将是什么样的关键?为什么?或者我怎么能阻止问题发生?
我希望这是有道理的,如果没有,请告诉我,我会提供更多信息。
提前致谢。
答案 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` ) ;