MySQL多列复合主键

MySQL composite primary key of multiple columns

我有这个table

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 计划,但我在更新它时遇到了问题。

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

如果我尝试插入的值匹配 class_iddayslot.

,我需要替换现有记录

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

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)

table 应该看起来像

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

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

主键必须是唯一的,所以在这种情况下使用 class_id 根本行不通。对您来说最简单的 "fix" 是将 class_id 与 day/slot 键结合起来,并将其作为您的主键 (class_id, day, slot)。您也可以在 class_id.

上添加一个外键
PRIMARY KEY (class_id, day, slot),
FORIEGN KEY (class_id) REFERENCES class(id) ON DELETE CASCADE