MySQL: # 1075 - Неверное определение таблицы;автоинкремент против другого ключа? - PullRequest
26 голосов
/ 14 ноября 2011

Вот таблица в MySQL 5.3.X + db:

CREATE TABLE members` (
  `id` int(11)  UNSIGNED NOT NULL AUTO_INCREMENT,
  `memberid` VARCHAR( 30 ) NOT NULL ,
  `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
  `firstname` VARCHAR( 50 ) NULL ,
  `lastname` VARCHAR( 50 ) NULL ,
  UNIQUE (memberid),
  PRIMARY KEY (id) 
) ENGINE = MYISAM;

Id столбец никогда не используется в запросах, он просто для наглядности (поэтому легко увидеть, какстол растет). Memberid является фактическим ключом, уникальным, и memberid используется в запросах для идентификации любого члена (WHERE memberid = 'abcde').

Мой вопрос:как сохранить auto_increment, но сделать memberid в качестве первичного ключа?Это возможно?Когда я пытаюсь создать эту таблицу с PRIMARY KEY (memberid) , я получаю сообщение об ошибке:

1075 - Неверное определение таблицы;может быть только один автоматический столбец, и он должен быть определен как ключ

Что является лучшим выбором (Надеюсь, существует способ сохранить столбец идентификатора, чтобы производительность была хорошей, и запросы идентифицировали любого пользователя поmemberid, а не по id), если производительность очень важна (хотя места на диске нет)?

Ответы [ 5 ]

47 голосов
/ 14 ноября 2011

Вы можете иметь столбец с автоинкрементом, который не является PRIMARY KEY, если на нем есть индекс (ключ):

CREATE TABLE members ( 
  id int(11)  UNSIGNED NOT NULL AUTO_INCREMENT,
  memberid VARCHAR( 30 ) NOT NULL , 
  `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
  firstname VARCHAR( 50 ) NULL , 
  lastname VARCHAR( 50 ) NULL , 
  PRIMARY KEY (memberid) ,
  KEY (id)                          --- or:    UNIQUE KEY (id)
) ENGINE = MYISAM; 
12 голосов
/ 20 января 2017

Сначала создать таблицу без auto_increment,

CREATE TABLE `members`(
    `id` int(11) NOT NULL,
    `memberid` VARCHAR( 30 ) NOT NULL ,
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
    `firstname` VARCHAR( 50 ) NULL ,
    `lastname` VARCHAR( 50 ) NULL
    PRIMARY KEY (memberid) 
) ENGINE = MYISAM;

после установки идентификатора в качестве индекса,

ALTER TABLE `members` ADD INDEX(`id`);

после установки идентификатора в качестве auto_increment,

ALTER TABLE `members` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT;

Или

CREATE TABLE IF NOT EXISTS `members` (
    `id` int(11) NOT NULL,
    `memberid` VARCHAR( 30 ) NOT NULL ,
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
    `firstname` VARCHAR( 50 ) NULL ,
    `lastname` VARCHAR( 50 ) NULL,
      PRIMARY KEY (`memberid`),
      KEY `id` (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
4 голосов
/ 14 ноября 2011

Вы можете сделать идентификатор первичным ключом и установить member_id равным NOT NULL UNIQUE.(Что вы и сделали.) Как и первичный ключ, столбцы, которые NOT NULL UNIQUE, могут быть целью ссылок на внешний ключ.(Я почти уверен, что это верно для всех платформ SQL.)

На концептуальном уровне нет никакой разницы между PRIMARY KEY и NOT NULL UNIQUE.На физическом уровне это проблема MySQL;другие платформы SQL позволят вам использовать последовательность, не делая ее первичным ключом.

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

1 голос
/ 16 октября 2016

Мне кажется, я понимаю, в чем причина вашей ошибки. Сначала вы щелкаете поле AUTO INCREMENT, а затем выбираете его в качестве первичного ключа.

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

Очень просто. Спасибо

1 голос
/ 28 января 2015

Для вышеупомянутой проблемы, прежде всего, если предположим, что таблицы содержат более 1 первичного ключа, затем сначала удалите все эти первичные ключи и добавьте первое поле AUTO INCREMENT в качестве первичного ключа, затем добавьте еще один обязательный первичный ключ, который был удален ранее.Установите опцию AUTO INCREMENT для обязательного поля из области опций.

...