2015-02-02 5 views
0

У меня есть эта таблица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 

Я надеюсь, что вы понимаете мою проблему, потому что Я действительно испортил это объяснение.

ответ

1

Первичный ключ должен быть уникальным, поэтому использование class_id в этом случае не будет работать вообще. Самое простое «исправление» для вас - объединить class_id с ключом день/слот, и это будет ваш PRIMARY KEY be (class_id, day, slot). Вы также можете пощепить внешний ключ на class_id.

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

О, боже, я подумал об этом, но я не знаю, почему я знал, что могу установить только составной первичный ключ максимум из 2 столбцов. Очевидно, я был неправ, спасибо! –

+1

Да, это на самом деле довольно распространенное заблуждение. Я думаю, вы можете подойти до 16 столбцов или что-то для композитного. – tazer84

Смежные вопросы