这是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),如果性能非常重要(尽管磁盘空间不是) ?
答案 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`);
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 KEY
和NOT 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();