当前位置: 首页 > 面试题库 >

Mysql Innodb:自动增量非主键

桑鸿志
2023-03-14
问题内容

是否可以自动增加非主密钥?

表“ 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,然后用book_comments_votes整个PK 替换中的comment_id 。这将使表的大小增加三倍以上。

有什么建议吗?有什么想法吗?


问题答案:

是的你可以。您只需要使该列成为索引即可。

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”插入具有自动递增值的行。但是,这确实是一件愚蠢的事情。

您已经说过正确的做法:

“进行comment_id PK,并通过对book_id,timestamp和user_id的唯一索引来增强完整性。”

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



 类似资料:
  • 问题内容: 我使用的是与开源Parse Server集成在一起的PostgreSQL 9.5 X64。我的表具有以下结构。 由于使用了Parse Server,因此是主键。它由Parse Server自动生成。该不是主键。我想在创建新记录时自动增加1。如何在创建表中实现? 问题答案: 您可以尝试制作专栏文章。我不知道是否可以更改当前列以使其为串行,因此我们可能必须删除该列,然后将其添加回去,如下所

  • 问题内容: 我有多个结构相同的数据库,有时会在其中复制数据。为了保持数据完整性,我使用两列作为主键。一个是数据库ID,它链接到包含有关每个数据库的信息的表。另一个是表键。它不是唯一的,因为它可能有多个行,且此值相同,但database_id列中的值不同。 我打算将这两列变成一个联合主键。但是,我也想将表键设置为自动递增-但基于database_id列。 EG,使用以下数据: 如果我要添加包含dab

  • 问题内容: 我正在尝试更改没有主键或auto_increment列的表。我知道如何添加主键列,但我想知道是否有可能自动将数据插入主键列(我已经在数据库中有500行,并希望为其提供ID,但我不想手动执行) 。有什么想法吗?非常感谢。 问题答案: 在我的测试中,添加列的语句可以正常工作: 在为测试目的而创建的临时表上,以上语句创建了该 列,并为该表中的每个现有行插入了自动递增值,从1开始。

  • 问题内容: 我有这样的代码 即使我非常确定我是第一次写记录,此代码也会给我一个 sqlite3.IntegrityError 异常。 所以,我尝试 这会将行细插入 基 表BUT中,ID列根本不会自动递增。 我能做什么?任何想法? 问题答案: 在sqlite中,仅当一个整数列是主键时,您才获得自动增量行为。复合键阻止自动增量生效。 通过定义为唯一的主键,然后在上添加一个附加的唯一约束,您可以获得类似

  • 问题内容: SQL Server中自动增量主键的上限是多少?SQL Server自动增量主键达到上限时会发生什么? 问题答案: Joel的答案是正确的,它是您使用的任何数据类型的上限。 这是其中两个的示例: 整数:2 ^ 31-1(2,147,483,647) bigint:2 ^ 63-1(9,223,372,036,854,775,807) 实际上,我所从事的工作已经达到极限。实际错误是: 我

  • 问题内容: 我想在ala SQL Server列中实现标识或自动递增值: 如何才能做到这一点? 问题答案: 正如Orbman所说,实现此目标的标准方法是使用序列。大多数人也将其与插入触发器结合在一起。因此,当插入没有ID的行时,触发器将触发以从序列中为您填写ID。 这是在Oracle中使用触发器的少数情况之一。