我有这张桌子
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
语法,因为它们不会经常更新。问题是我不知道如何设置索引,以便在要插入的行的day
和slot
存在时替换它。目前,每当我插入已存在的class_id
行时,它都会替换。
如果我尝试插入的值与class_id
,day
和slot
匹配,我需要更换现有记录。
不确定我是否做得很好解释问题,让我举个例子。如果表中的值是这样的
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
我希望你理解我的问题,因为我真的搞砸了解释它。
答案 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