Подтвердить что ты не робот

Первичный ключ Multi-Column в MySQL 5

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

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

4b9b3361

Ответ 1

Цитата из CREATE TABLE Синтаксис:

ПЕРВИЧНЫЙ КЛЮЧ может быть многоколоночным индекс. Однако вы не можете создать индекс с несколькими столбцами, используя Ключевой атрибут PRIMARY KEY в столбце Спецификация. Это делается только для отметок этот единственный столбец как первичный. Вы должен использовать отдельную ОСНОВНУЮ Предложение 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. Ограничения FOREIGN KEY

Ответ 2

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

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

Теперь вы хотите объединить свою библиотеку со своей соседкой, но все же сможете отличить, к какой книге принадлежит. Домен теперь шире, и первичный ключ теперь (владелец, 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.

Ответ 3

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