这是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 -表定义不正确;auto列只能有一个,并且必须定义为键
如果性能非常重要(尽管磁盘空间不是),那么最好的选择是什么(希望有一种方法可以保留id列,以便性能良好,并且查询通过memberid而不是id标识任何用户)?
您可以有一个非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;
首先创建没有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;
ALTER TABLE `members` ADD INDEX(`id`);
set id as 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 ;
可以设置id为主键,并设置member_id为NOT NULL UNIQUE
。(你已经做到了。)NOT NULL UNIQUE
列可以是外键引用的目标,就像主键一样。(我很确定所有SQL平台都是如此)
在概念层面上,PRIMARY KEY
和NOT NULL UNIQUE
之间没有差异。在物理层面上,这是一个MySQL问题;其他SQL平台允许您使用序列而不将其设为主键。
但是,如果性能真的很重要,那么您应该仔细考虑是否要将表每行扩大4个字节以获得微小的视觉方便。另外,如果你切换到INNODB来强制外键约束,MySQL将在集群索引中使用你的主键。由于没有使用主键,我想这会影响性能。
正确的方法是首先你必须选择它作为主键,然后你必须点击auto auto INCREMENT字段
非常容易。由于
对于上述问题,首先,如果假设表包含超过1个主键,那么首先删除所有这些主键,并添加第一个AUTO INCREMENT字段作为主键,然后添加另一个所需的主键,该主键先前已删除。
在阅读此线程时识别此解决方案。我想我可能会给下一个人发这篇文章。
在处理从包迁移的Laravel文件时,我遇到了这个问题。
我原来的值是
$table->increments('id');
我的新
$table->integer('id')->autoIncrement();