Как правильно создавать составные первичные ключи - MYSQL

Вот грубое упрощение интенсивной настройки, с которой я работаю. table_1 и table_2 оба имеют первичные ключи суррогата с автоинкрементами в качестве идентификатора. info - это таблица, содержащая информацию обо всех table_1 и table_2.

table_1 (id, field)  
table_2 (id, field, field)
info ( ???, field)

Я пытаюсь решить, должен ли я сделать первичный ключ info составной частью идентификаторов от table_1 и table_2. Если бы я это сделал, какой из них имеет смысл?
(в этом примере я объединяю ID 11209 с ID 437)

INT(9) 11209437 (я могу представить, почему это плохо)
VARCHAR (10) 11209-437
DECIMAL (10,4) 11209.437

Или что-то еще?

Хорошо ли это использовать в качестве основного ключа в базе данных MYISQL MYISAM?

Ответ 1

Я бы использовал составной (многоколоночный) ключ.

CREATE TABLE INFO (
    t1ID INT,
    t2ID INT,
    PRIMARY KEY (t1ID, t2ID)
) 

Таким образом, вы можете иметь t1ID и t2ID в качестве внешних ключей, указывающих на соответствующие таблицы.

Ответ 2

Я бы не сделал первичный ключ таблицы "info" составным из двух значений из других таблиц.

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

Я бы всегда держал их как два разных столбца. Вы можете использовать ключ с двумя столбцами в mysql... PRIMARY KEY (id_a, id_b)... но я предпочитаю использовать уникальный индекс с двумя столбцами и иметь поле первичного ключа с автоматическим приращением.

Ответ 3

синтаксис CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3), например::

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

приведенный выше пример будет работать, если вы его нарисуете во время создания таблицы, например:

CREATE TABLE person (
   P_Id int ,
   ............,
   ............,
   CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);

чтобы добавить это ограничение в существующую таблицу, вам нужно следовать следующему синтаксису

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (P_Id,LastName)

Ответ 4

Композитные первичные ключи - это то, что вы хотите, где хотите создать отношение многих к многим с таблицей фактов. Например, у вас может быть пакет аренды для отдыха, который включает в себя ряд свойств. С другой стороны, собственность также может быть доступна в составе ряда пакетов аренды, как самостоятельно, так и с другими объектами. В этом случае вы устанавливаете связь между имуществом и пакетом аренды с таблицей фактов свойств/пакетов. Связь между свойством и пакетом будет уникальной, вы только когда-нибудь присоединитесь к использованию property_id с таблицей свойств и/или package_id с таблицей пакетов. Каждая взаимосвязь уникальна, и ключ auto_increment является избыточным, поскольку он не будет присутствовать ни в одной другой таблице. Следовательно, определение составного ключа - это ответ.

Ответ 5

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

В качестве примера, каждое государство США имеет множество уникальных районов Конгресса. Хотя многие государства могут индивидуально иметь CD-5, в любом из 50 штатов никогда не будет более одного CD-5 и наоборот. Поэтому создание поля autonumber для Massachusetts CD-5 было бы излишним.

Если база данных управляет динамической веб-страницей, написание кода для запроса в комбинации с двумя полями может быть намного проще, чем извлечение/повторная отправка ключа с автозапуском.

Поэтому, пока я не отвечаю на исходный вопрос, я, безусловно, ценю ответ Адама.

Ответ 6

CREATE  TABLE `mom`.`sec_subsection` (

  `idsec_sub` INT(11) NOT NULL ,

  `idSubSections` INT(11) NOT NULL ,

  PRIMARY KEY (`idsec_sub`, `idSubSections`) 

);

Ответ 7

@AlexCuse Я хотел добавить это как комментарий к вашему ответу, но отказался после нескольких попыток добавить новые строки в комментарии.

Тем не менее, t1ID уникален в таблице_1, но это не делает его уникальным в таблице INFO.

Например:

Таблица_1:
Поле идентификатора
1 A
2 B

Таблица_2:
Поле идентификатора
1 X
2 Y

INFO, то может быть:
Поле t1ID t2ID
1 1 некоторые
1 2 данные
2 1 в каждом 2 2 строки

Итак, в таблице INFO для однозначной идентификации строки вам нужны как t1ID, так и t2ID

Ответ 8

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

alter table employee add primary key(emp_id,emp_name);