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
语法,因为它们不会经常更新。问题是我不知道如何设置索引,以便在存在要插入的行的 day
和 slot
时替换它。目前,每当我插入一行 class_id
已经存在时,它就会替换。
如果我尝试插入的值匹配 class_id
、day
和 slot
.
,我需要替换现有记录
不确定我是否把问题解释得很好,让我举个例子。如果 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
我有这个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
语法,因为它们不会经常更新。问题是我不知道如何设置索引,以便在存在要插入的行的 day
和 slot
时替换它。目前,每当我插入一行 class_id
已经存在时,它就会替换。
如果我尝试插入的值匹配 class_id
、day
和 slot
.
不确定我是否把问题解释得很好,让我举个例子。如果 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