40

Here is a table in 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 column is never used in queries, it is just for visual convenience (so it's easy to see how the table grows). Memberid is an actual key, is unique, and memberid is used in queries to identify any member (WHERE memberid='abcde').

My question is: how to keep auto_increment, but make memberid as a primary key? Is that possible? When I try to create this table with PRIMARY KEY (memberid), I get an error:

1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

What is the best choice (Hopefully, there is a way to keep id column so performance is good and queries identify any user by memberid, not by id), if the performance is very important (although the disk space is not)?

4

6 回答 6

65

可以有一个不是 的自动增量列,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; 
于 2011-11-13T21:44:21.610 回答
18

首先创建没有 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 ;
于 2017-01-20T06:30:02.313 回答
4

您可以将 id 设为主键,并将 member_id 设置为NOT NULL UNIQUE. (您已经完成了。)NOT NULL UNIQUE可以作为外键引用的目标的列,就像主键一样。(我很确定所有 SQL 平台都是如此。)

PRIMARY KEY在概念层面,和之间没有区别NOT NULL UNIQUE。在物理层面,这是一个 MySQL 问题;其他 SQL 平台将允许您使用序列而不将其作为主键。

但是,如果性能真的很重要,您应该三思而后行,将表格每行扩大 4 个字节,以获得微小的视觉便利。此外,如果您切换到 INNODB 以强制执行外键约束,MySQL 将在聚集索引中使用您的主键。由于您没有使用主键,我想这可能会损害性能。

于 2011-11-13T21:40:50.393 回答
2

我想我明白你错误的原因是什么。首先单击自动 AUTO INCREMENT 字段,然后选择它作为主键。

正确的方法是首先您必须选择它作为主键,然后您必须单击自动 AUTO INCREMENT 字段。

很容易。谢谢

于 2016-10-16T14:12:07.003 回答
1

对于上述问题,首先如果假设表包含多个主键,则首先删除所有这些主键并添加第一个 AUTO INCREMENT 字段作为主键,然后添加另一个之前删除的所需主键。从选项区域为必填字段设置 AUTO INCREMENT 选项。

于 2015-01-28T09:16:56.730 回答
1

在阅读此线程时确定了此解决方案。想通了可能会为下一个人发布此信息。

在处理包中的 Laravel 迁移文件时,我遇到了这个问题。

我的旧值是

$table->increments('id');

我的新

$table->integer('id')->autoIncrement();
于 2020-10-12T01:37:14.430 回答