2012-02-08 59 views
0

对某些人来说,这可能是一个非常简单的问题,但我觉得很难理解。这是一个什么样的关键?

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

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

的数据库将如何看一个例子:

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

正如你所看到的,相同的数据可以被输入到表中不止一次(带星号如上图所示)。我希望这个停止发生。我的问题是,这将是什么样的关键?为什么?或者我怎么能阻止这个问题的发生?

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

在此先感谢。

+0

这是什么类型的数据库? MySQL的? – 2012-02-08 00:21:16

回答

3

你会想在subject_id和class_id上有一个唯一的密钥来防止重复。但是您需要确保您的应用程序能够:处理在尝试插入已存在的值组合时尝试阻止其提交重复项的错误。或者,如果您希望后续插入覆盖现有条目,则应查看数据库软件是否可以处理ON DUPLICATE KEY UPDATE。

0

几乎所有你需要的是一个UNIQUE适用于两列。一般流程如下:应用程序尝试保存关系而不在动作之前进行验证并等待数据库应答。在重复的情况下,插入返回一个错误,应该在应用程序中进一步处理。

+0

他希望这样做,以便每列可以有多个条目,只要两列的两行都不相同即可。所以(1,2)(1,3)(2,4)的(subject,class)是可以的,但是有(1,2)两次不是。 – Tim 2012-02-08 00:22:09

+0

@Tim,这就是为什么有* one *唯一键应用于两列。 – 2012-02-08 00:23:02

+0

对不起,误读。认为你的意思是每个专栏应该是独一无二的。 – Tim 2012-02-08 00:23:51

-1

在两个字段中添加一个UNIQUE。

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

这不会改变任何唯一性! – 2012-02-08 00:22:34

0

你想要一个独特的密钥,跨越两行:这样两列每个可以有非唯一数据,而不是在组合

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

更好,如果你确认它在您正在使用的应用程序编程语言。在更新插入数据库之前应用检查。

在数据库级别,您可以使用组合唯一键。唯一标识一行。

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

那也不处理同步请求,至少不是那么容易。 – 2012-02-08 00:23:37

+0

查看更新的答案。 – 2012-02-08 00:29:14

0

创建横跨两个领域

ALTER TABLE subject_class ADD PRIMARY KEY (subject_id, class_id) 

一个主键,但你将需要删除重复项,然后才能添加索引。