gpt4 book ai didi

mysql - 具有重复值和多列主键的 SQL 自动增量 ID?

转载 作者:行者123 更新时间:2023-11-29 05:11:26 25 4
gpt4 key购买 nike

CREATE TABLE Apps
(
id int NOT NULL,
company varChar(20) NOT NULL,
name varChar(20) NOT NULL,
CONSTRAINT company_app_id PRIMARY KEY (id, company)
)

-------------------------------------
| id | company | name |
-------------------------------------
| 1 | Google | Google Maps |
| 2 | Google | Gmail |
| 1 | Apple | Safari |
| 3 | Google | Chrome |
| 2 | Apple | Pages |
-------------------------------------

在 SQL 中是否有一种方法可以构建上表,使其能够自动递增特定于公司的 ID?那么,如果下一个条目是 Google 应用程序,它会自动将 id 增加到 4,如果下一个条目是 Apply 应用程序,它会自动将 id 增加到 2?

谢谢

最佳答案

不,除非您的 INSERT 获取表锁,否则无法执行此操作。原因是 INSERT 必须计算出您要为其插入行的相应公司到目前为止的最大值是多少。具有该最大值的行可以在表中的任何位置。并且 INSERT 必须搜索它,同时防止任何其他 INSERT 同时运行,否则就会出现竞争条件。

InnoDB 表的 INSERT 不支持这种表锁定行为。 InnoDB 可以执行允许并发 INSERT 的自动递增,因为它跟踪每个表的一个最大值并且它只递增,它不会向后移动或“撤消”递增。

MyISAM 在使用复合主键时支持按不同值递增的特性。毕竟,MyISAM 已经为 INSERT 或其他更新做了一个表锁。在我看来,这个特性不足以成为使用 MyISAM 的理由。

正如@sgeddes 上面评论的那样,这样做的值(value)无论如何都是值得怀疑的。当出现间隙时,您会怎么做,例如,如果您删除一行或 INSERT 回滚?您是否必须重新编号主键,可能会更新数千行?您是否尝试将后续行插入空白?这将需要另一个表锁,在执行此操作时搜索间隙并阻止其他插入。

基本上,请牢记这条规则:主键不是行号。不要将其视为行号。主键必须具有唯一值——但不是连续值。


关于您的评论:不,您不应该认为自动递增数字有任何意义,甚至是创建顺序。一方面,auto-inc 值的顺序并不总是提交行的顺序。

最好对 Rails 告诉您的有关数据库的任何内容持保留态度。 Rails 的设计者真的非常希望数据库开发比现在更简单。在过去 10 年里,Rails 对开发人员造成了巨大的伤害。

关于mysql - 具有重复值和多列主键的 SQL 自动增量 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38854105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com