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

У меня такая ситуация:

MySQL — вопрос новичка: какой PK и FK для этих таблиц? (взгляните на таблицу Зарплаты)

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

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

Я получаю сообщение об ошибке, если пытаюсь использовать приведенный выше код. Любые идеи?


person cc.    schedule 19.10.2009    source источник
comment
Помните, что при создании составного первичного ключа данные в комбинации полей ключа должны быть уникальными. В примере с зарплатами из другого вопроса два ключа идентификатора не были бы уникальными без других данных, поскольку у людей время от времени будет меняться заработная плата.   -  person HLGEM    schedule 19.10.2009


Ответы (6)


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

CREATE TABLE salaries (
    dep_id SMALLINT UNSIGNED NOT NULL,
    an_id SMALLINT UNSIGNED NOT NULL,
    bla VARCHAR(20),
    PRIMARY KEY (dep_id, an_id)
);
person Ben James    schedule 19.10.2009
comment
Первичный ключ по умолчанию auto_increment? - person cc.; 19.10.2009
comment
@cc: в этом случае вы не хотите, чтобы это было автоматическое увеличение. Ответ должен включать настройку внешнего ключа, чтобы быть на 100% правильным. - person OMG Ponies; 19.10.2009

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

person Raj More    schedule 19.10.2009

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

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

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

person JohnFx    schedule 19.10.2009

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

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

person Brian Schroth    schedule 19.10.2009
comment
Базы данных MOst не допускают автоинкремента более чем для одного ключа. В любом случае, редко требуется автоинкремент для составного ключа, поскольку они часто представляют собой комбинацию Fks из какой-либо другой таблицы или данных строкового типа. - person HLGEM; 19.10.2009

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

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)
);
person Martin Nycander    schedule 19.10.2009

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

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

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

person Larry Lustig    schedule 19.10.2009