Первичный ключ является понятие домена, которое однозначно (обязательно и достаточно) идентифицирует объект среди аналогичных субъектов. Сводный (многоколоночный) первичный ключ имеет смысл только тогда, когда часть ключа относится к конкретному экземпляру другого объекта домена.
Предположим, у вас есть личная коллекция книг. Пока вы одиноки, вы можете подсчитать их и назначить каждому номеру. Номер является основным ключом домена вашей библиотеки.
Теперь вы хотите объединить свою библиотеку с библиотекой своего соседа, но все же сможете отличить, к кому принадлежит книга. Домен теперь шире и первичный ключ теперь (владелец, book_id).
Таким образом, создание каждого первичного ключевого композита не должно быть вашей стратегией, но вы должны использовать его, когда это необходимо.
Теперь некоторые факты о MySQL. Если вы определяете составной первичный ключ и хотите, чтобы RDBSM автоматически определял идентификаторы для вас, вы должны знать о различии между поведением MyISAM и InnoDB.
Предположим, нам нужна таблица с двумя полями: parent_id, child_id. И мы хотим, чтобы child_id был автоинкрементным.
MyISAM будет автоматически автоинкрементно в пределах записей с одним и тем же parent_id, и InnoDB будет автоинкремент уникально в пределах всей таблицы.
В MyISAM вы должны определить первичный ключ как (parent_id, child_id) и в InnoDB as (child_id, parent_id), поскольку поле с автоинкрементами должно быть самым левым компонентом в первичном ключе в InnoDB.
Возможный дубликат [Как правильно создавать составные первичные ключи - MYSQL] (http://stackoverflow.com/questions/5835978/how-to-properly-create-composite-primary-keys-mysql) –
Не удается быть дубликатом чего-то, опубликованного 3 года спустя. – Kaji
http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha ;-) –