MySQL:#1075 - 表定义不正确;自动增量与另一个关键?

时间:2011-11-13 20:35:35

标签: mysql primary-key auto-increment mysql-error-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列,以便性能良好,查询通过memberid识别任何用户,而不是id),如果性能非常重要(尽管磁盘空间不是) ?

6 个答案:

答案 0 :(得分:47)

可以拥有一个不是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; 

答案 1 :(得分:11)

首先创建没有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 ;

答案 2 :(得分:4)

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

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

但是,如果性能非常重要,那么为了这种极小的视觉便利,你应该三思而后行,将每行扩展四个字节。此外,如果您切换到INNODB以强制执行外键约束,MySQL将在聚簇索引中使用您的主键。由于您没有使用主键,我认为这可能会影响性能。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

  

正确的方法是首先你必须选择它作为主键   必须单击auto AUTO INCREMENT字段。

很简单。 感谢

答案 5 :(得分:1)

在读取此线程时标识了此解决方案。想通的身份证可能会发布给下一个家伙。

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

我以前的价值是

$table->increments('id');

我的新人

$table->integer('id')->autoIncrement();