MySQL复合多列的主键

时间:2015-02-02 16:59:55

标签: mysql indexing

我有这张桌子

CREATE TABLE `classes_subjects` (
 `class_id` int(10) unsigned NOT NULL,
 `subject_id` int(10) unsigned NOT NULL,
 `day` tinyint(1) unsigned NOT NULL,
 `slot` tinyint(1) unsigned NOT NULL,
 PRIMARY KEY (`class_id`),
 UNIQUE KEY `day` (`day`,`slot`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我正在建立一个系统来设置和显示学校课程,但我在更新课程时遇到了麻烦。

基本上它是如何工作的我有一个class_id然后为每个班级我有1到5天的时间和从1到10的插槽或每天代表主题的东西。现在为了避免构建插入和更新功能,我认为我可以使用REPLACE语法,因为它们不会经常更新。问题是我不知道如何设置索引,以便在要插入的行的dayslot存在时替换它。目前,每当我插入已存在的class_id行时,它都会替换。

如果我尝试插入的值与class_iddayslot匹配,我需要更换现有记录。

不确定我是否做得很好解释问题,让我举个例子。如果表中的值是这样的

class_id | subject_id | day | slot
1        | 1          | 1   | 1
1        | 2          | 1   | 2

然后我尝试执行以下语句

REPLACE INTO `classes_subjects` (class_id, subject_id, day, slot) VALUES (1,3,1,1), (1,4,1,3)

该表应该看起来像

class_id | subject_id | day | slot
1        | 3          | 1   | 1
1        | 2          | 1   | 2
1        | 4          | 1   | 3

我希望你理解我的问题,因为我真的搞砸了解释它。

1 个答案:

答案 0 :(得分:1)

主键必须是唯一的,因此在这种情况下使用class_id根本不会起作用。最简单的"修复"因为你将class_id与day / slot键组合在一起,并将它作为你的PRIMARY KEY(class_id,day,slot)。您也可以在class_id上打一个外键。

PRIMARY KEY (class_id, day, slot),
FORIEGN KEY (class_id) REFERENCES class(id) ON DELETE CASCADE