2009-10-19 2 views
2

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

MySQL - Newbie question: Which are the PK and the FK for these tables? (взглянуть на таблицу Зарплаты)

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

create table salaries 
(
    dep_id smallint auto_increment primary key, 
    emp_id smallint auto_increment primary key, 
    bla varchar(20) 
); 

Получать ошибку, если я попробую использовать код выше. Есть идеи?

+1

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

ответ

9

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

CREATE TABLE salaries (
    dep_id SMALLINT UNSIGNED NOT NULL, 
    an_id SMALLINT UNSIGNED NOT NULL, 
    bla VARCHAR(20), 
    PRIMARY KEY (dep_id, an_id) 
); 
+0

Первичный ключ по умолчанию auto_increment? –

+1

@cc: В этом случае вы не хотите, чтобы он был автоматически приращением. Ответ должен включать настройку внешнего ключа на 100% правильно. –

3

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

0
create table salaries 
(dep_id smallint auto_increment, 
    an_id smallint auto_increment, 
    bla varchar(20), 
    PRIMARY_KEY (dep_id, an_id) 
); 

не уверен, если вы можете использовать автоматическое приращение на них обоих, хотя

+1

MOST-базы данных не позволяют автоинкремент на нескольких ключах.В любом случае, редко требуется автоинкремент на составном ключе, поскольку они часто представляют собой комбинацию Fks из какой-либо другой таблицы или данных типа строки. – HLGEM

0

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

create table salaries 
(
    dep_id SMALLINT, 
    emp_id SMALLINT, 
    bla varchar(20), 
    INDEX (dep_id, emp_id), 
    FOREIGN KEY (dep_id) REFERENCES Department(dep_id), 
    FOREIGN KEY (emp_id) REFERENCES Employees(emp_id) 
); 
2

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

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

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

0

Ваш дизайн значительно испорчен, как описано в другом вопросе, с которым вы связались.

Dep_ID, вероятно, не относится к зарплате, он принадлежит (как первичный ключ) в департаментах и ​​как иностранный ключ для сотрудников. Если это относится к зарплате (потому что ваши сотрудники могут одновременно оплачиваться из двух отделов или могут менять отделы, а вы сохраняете данные о предыстории), это не должно быть частью первичного ключа.

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