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

MySQL: # 1075 - неверное определение таблицы; автоинкремент против другого ключа?

Вот таблица в 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 - неправильное определение таблицы; может быть только один автоматический столбец, и он должен быть определен как ключ

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

4b9b3361

Ответ 1

У вас может есть столбец автоинкремента, который не является 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; 

Ответ 2

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

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

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

Ответ 3

Сначала создайте таблицу без 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;

после установки id как индекса,

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

после установки 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

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

Ответ 5

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

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

Очень легко. Благодаря