У меня есть эта таблицаMySQL составной первичный ключ из нескольких столбцов
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
Я надеюсь, что вы понимаете мою проблему, потому что Я действительно испортил это объяснение.
О, боже, я подумал об этом, но я не знаю, почему я знал, что могу установить только составной первичный ключ максимум из 2 столбцов. Очевидно, я был неправ, спасибо! –
Да, это на самом деле довольно распространенное заблуждение. Я думаю, вы можете подойти до 16 столбцов или что-то для композитного. – tazer84