【问题标题】:MySQL: #1075 - Incorrect table definition; autoincrement vs another key?MySQL:#1075 - 表定义不正确;自动增量与另一个键?
【发布时间】:2011-12-28 05:02:16
【问题描述】:

这是 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 来识别任何用户) ?

【问题讨论】:

    标签: mysql primary-key auto-increment mysql-error-1075


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这将使 ENGINE => MISAM 到 INNODB
      • @KanagaveluSugumar 我不确定我是否关注你。问题中的表格是 MyISAM。
      • @ypercubeᵀᴹ 我正在使用 AWS Aurora,在尝试 stackoverflow.com/questions/5416548/… 时遇到了 1075 问题。然后尝试添加KEY(id) 的建议,然后得到1 warning(s): 1266 Using storage engine InnoDB for table 'MYTABLE' 的警告,这意味着我无法使用MYISAM 引擎创建该表,尽管它在DDL 中提到
      • @KanagaveluSugumar 请参阅aws.amazon.com/rds/aurora/faqs某些 MySQL 功能(如 MyISAM 存储引擎)不适用于 Amazon Aurora。 欢迎来到 2018 年,MyISAM 是死了;)
      • @ypercubeᵀᴹ 谢谢!是的;您的解决方案已在我的本地 mysql 数据库中运行。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        很容易。 谢谢

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 谢谢,首先设置索引帮助我手动将 Auto_increment 添加到现有表中的列。
          【解决方案6】:

          在阅读此线程时确定了此解决方案。想办法把这个贴给下一个人吧。

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

          我的旧值是

          $table->increments('id');
          

          我的新

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

          【讨论】:

            猜你喜欢
            • 2019-01-02
            • 2013-07-12
            • 2017-05-31
            • 2013-12-17
            • 1970-01-01
            • 2015-11-17
            • 2012-08-29
            • 1970-01-01
            相关资源
            最近更新 更多