Многоколонный первичный ключ в MySQL 5 - PullRequest
21 голосов
/ 15 апреля 2010

Я пытаюсь научиться использовать ключи и избавиться от привычки обязательно иметь идентификаторы типа SERIAL для всех строк во всех моих таблицах. В то же время я также делаю отношения «многие ко многим», и поэтому требуются уникальные значения в любом столбце таблиц, которые координируют отношения, будет препятствовать этому.

Как определить первичный ключ в таблице так, чтобы любое заданное значение могло повторяться в любом столбце, если комбинация значений во всех столбцах никогда точно не повторяется?

Ответы [ 3 ]

48 голосов
/ 15 апреля 2010

Цитируется из Синтаксис CREATE TABLE Страница:

ПЕРВИЧНЫЙ КЛЮЧ может состоять из нескольких столбцов индекс. Тем не менее, вы не можете создать индекс нескольких столбцов с использованием Ключевой атрибут первичного ключа в столбце Спецификация. При этом только отметки этот единственный столбец в качестве основного. Вы должен использовать отдельный ПЕРВИЧНЫЙ Предложение KEY (index_col_name, ...).

Нечто подобное можно использовать для первичных ключей из нескольких столбцов:

CREATE TABLE
    product (
        category INT NOT NULL,
        id INT NOT NULL,
        price DECIMAL,
        PRIMARY KEY(category, id)
    );

С 13.6.4.4. ИНОСТРАННЫЙ КЛЮЧ Ограничения

18 голосов
/ 15 апреля 2010

Первичный ключ - это концепция домена, которая однозначно (обязательно и достаточно) идентифицирует вашу сущность среди аналогичных сущностей. Составной (с несколькими столбцами) первичный ключ имеет смысл только тогда, когда часть ключа ссылается на конкретный экземпляр другой доменной сущности.

Допустим, у вас есть личная коллекция книг. Пока вы одни, вы можете считать их и назначать каждому номер. Номер является первичным ключом домена вашей библиотеки.

Теперь вы хотите объединить свою библиотеку с библиотекой своего соседа, но все же сможете различить, кому принадлежит книга. Домен стал шире, а первичный ключ теперь (owner, book_id).

Таким образом, создание каждого составного первичного ключа не должно быть вашей стратегией, но вы должны использовать его при необходимости.

Теперь несколько фактов о MySQL. Если вы определяете составной первичный ключ и хотите, чтобы RDBSM автоматически инкорпорировал для вас идентификаторы, вы должны знать о разнице между поведением MyISAM и InnoDB.

Допустим, нам нужна таблица с двумя полями: parent_id, child_id. И мы хотим, чтобы child_id автоматически инкремментировался.

MyISAM будет автоматически увеличиваться автоматически в записях с одинаковым parent_id, а InnoDB будет автоматически увеличиваться автоматически во всей таблице.

В MyISAM вы должны определить первичный ключ как (parent_id, child_id), а в InnoDB - как (child_id, parent_id), поскольку автоинкрементное поле должно быть самым левым компонентом первичного ключа в InnoDB.

0 голосов
/ 28 июня 2013

Первичный ключ - это уникальное значение для строки. Нет смысла включать цену, значение, которое может измениться. Представьте, что если бы вам пришлось изменить большой диапазон цен, все эти первичные ключевые значения изменились бы. Какой бы это был беспорядок!

...