Mysql自动递增主键id';s
我有一些mysql表,它们具有作为主键的自动递增id,但我注意到我从未实际使用过它们。。。我曾经认为每个表都必须有一个主键,所以我想这就是我以前创建它们的原因。如果我根本不使用它们,我应该全部删除它们吗?除非您遇到空间问题,否则我不会删除它们 如果您错误地(或疏忽地)用重复/错误的数据填充数据库,它们是一个救生圈 它们还有助于创建相关表,通过自动生成的id引用一个表上的内容 这是假设您有用于实际查询数据的其他列的索引(如果没有,那么就有更多的理由保留自动增量ID并使用它们!)。有趣!。。。 在这里,我似乎持有少数意见,无论是上票还是下票,目前都是0,但多数意见中的任何人(见上面的回答)似乎都没有理由保留id字段,而下层选民甚至没有留下评论来暗示为什么取消身份证是个坏主意 在他们的辩护中,我自己最初的回答没有包含任何有力的论据,说明为什么在某些情况下可以去掉id属性(这似乎适用于OP)。也许这种无缘无故的反应本身就是一种令人沮丧的反应 请务必教育我和OP,通过留下评论支持或反对u systemic(我强调“systemic”)需要在所有表中包含自动递增的非语义主键。我返回了一个承诺,并在回复中添加了一个原因列表,列出了为什么它可能对[再次,系统性地]实施自动递增PK有害的原因 我最初的回答: 当然!你可以移除这些 在对数据库执行任何操作之前,请确保有备份,尤其是数据库大小非常重要 使用该语句删除要删除的表中的id。特别是Mysql自动递增主键id';s,mysql,primary-key,auto-increment,Mysql,Primary Key,Auto Increment,我有一些mysql表,它们具有作为主键的自动递增id,但我注意到我从未实际使用过它们。。。我曾经认为每个表都必须有一个主键,所以我想这就是我以前创建它们的原因。如果我根本不使用它们,我应该全部删除它们吗?除非您遇到空间问题,否则我不会删除它们 如果您错误地(或疏忽地)用重复/错误的数据填充数据库,它们是一个救生圈 它们还有助于创建相关表,通过自动生成的id引用一个表上的内容 这是假设您有用于实际查询数据的其他列的索引(如果没有,那么就有更多的理由保留自动增量ID并使用它们!)。有趣!。。。 在这
ALTER TABLE myTable DROP列id (如果表具有PK约束,则在删除id之前还需要删除PK约束) 编辑(稍后添加)
在许多情况下,携带自动递增的ID密钥是没有意义的,不管这些密钥增加的额外存储需求相对较少。
在所有这些情况下,潜在的含义是
- 要么数据本身提供主键
- 或者,应用程序管理密钥生成
- 有效的数据完整性可能未经检查
i、 e.服务器可能允许记录插入更新,从而创建重复的[本机]密钥(尽管人工的、自动递增的主键隐藏了这一事实) - 当依赖自动递增的PK来支持表之间的联接时,当必须更新部分[本机]键值时…
…我们可以创建完整删除记录的需要,然后使用新闻值重新插入该记录,
…或保留过时/不正确链接的风险 - 具有自动递增键的常见“后续”操作是在表上为此键创建聚集索引。 这对于没有本机主键或应用程序提供的主键的表是有意义的,对于具有此类键的数据集也是如此。 这有效地防止了为聚集索引选择一个键,这可能对最常见的查询模式更有利
- 根据DBMS的不同,使用自动递增键迁移表可能会变得更加困难(需要在复制之前将基础列声明为纯整数,然后需要再次启动自动递增…)
- 对于窄表,即只有几列的表,自动递增PK的相对成本可能非常大,并且以不可忽略的方式影响性能
- 在相关表中插入新记录和相关记录时,需要在插入主记录后获得自动递增键,然后才能插入相关记录;当支持链接的列值提前已知时,逻辑更简单
如果您有保证每一行都是唯一的东西,那么您可以将其用作键;否则保留主键和自动生成的ID。我个人会保留它们。如果您以后扩展数据库设计并需要引用此表,它们将特别有用。是的,如果您可以找到另一个主键 你的桌子设计显然有缺陷。例如,你有一张像这样的桌子
关系id(PK)、父id、子id
。
众所周知,父项的组合