36

是否可以自动增加非主键?

表“book_comments”

book_id     medium_int
timestamp   medium_int
user_id     medium_int
vote_up     small_int
vote_down   small_int
comment     text
comment_id  medium_int

Primary key -> (book_id, timestamp, user_id)

此表上不会有其他索引。但是,我想使comment_id列自动递增,以便我可以轻松地创建另一个表:

表“book_comments_votes”

comment_id  (medium_int)
user_id     (medium_int)

Primary key -> (comment_id, user_id)

用户每本书评论只能投票一次。此表通过主键强制执行此规则。

问题:

是否可以自动增加非主键 - 如自动增加comment_id表“book_comments”中的列?


替代方案,讨论。

如上所述,为了简单起见,我想这样做。替代方案并不乐观。

  • 制作 commnet_id PK 并通过book_id, timestamp, user_id. 在这种情况下,我会创建一个额外的索引。
  • 保留 PK 并将其中的 comment_id 替换为book_comments_votes整个 PK。这将使桌子的大小增加三倍以上。

建议?想法?

4

3 回答 3

50

是的你可以。您只需将该列设为索引即可。

CREATE TABLE `test` (
  `testID` int(11) NOT NULL,
  `string` varchar(45) DEFAULT NULL,
  `testInc` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`testID`),
  KEY `testInc` (`testInc`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;


insert into test(
  testID,
 string
)
values (
1,
    'Hello'
);


insert into test( 
testID,
 string
)
values (
2,
    'world'
);

将为“testInc”插入具有自动递增值的行。然而,这是一件非常愚蠢的事情。

您已经说过正确的方法:

“通过 book_id、timestamp、user_id 上的唯一索引进行 comment_id PK 并强制执行完整性。”

这正是你应该这样做的方式。它不仅为您提供了将来查询所需的表的正确主键键,而且还满足了最小惊讶原则

于 2012-12-30T02:12:09.110 回答
1

你有现有的表。如果你已经给了一个主键comment_id并且唯一的目的是设置 auto_increment。您可以将主键拖放到该列。MySQL 允许具有任何 key 属性的列可以访问 auto_increment。所以最好尝试索引或unique key喜欢comment_id下面。

1.删​​除主键

ALTER TABLE `book_comments` MODIFY `comment_id` INT(5) NOT NULL;

ALTER TABLE `book_comments` DROP PRIMARY KEY ;
  1. 添加属性AUTO_INCREMENTUNIQUE_KEY

ALTER TABLE 'brand_keywords' CHANGE COLUMN 'comment_id' 'comment_id' INT(5) NOT NULL AUTO_INCREMENT UNIQUE;

于 2017-03-28T08:47:43.667 回答
0

从 MySQL 5.5 开始,似乎可以在没有索引或主键的情况下为 INT 字段提供自动增量。

于 2014-03-13T06:55:48.923 回答