我有一些自动递增id的mysql表是主键,但我注意到我从未真正使用它们......我曾经认为每个表都必须有一个主键所以我猜这就是我创建的原因他们之前。如果我根本不使用它们,我应该将它们全部删除吗?
答案 0 :(得分:9)
除非遇到太空问题,否则我不会删除它们。
如果您错误地(或疏忽)使用重复/错误数据填充数据库,它们可以节省生命。
它们还有助于拥有相关表格,您可以通过自动生成的ID在一个表格中引用内容。
这假设您有用于实际查询数据的其他列的索引(如果没有,那么更多的理由保留自动增量ID并使用它们。)。
答案 1 :(得分:3)
没有。
你应该保留它们;数据库总是需要将行与另一行区分开来的东西(某种“键”)。
如果您确保每行都有一些独特的东西,那么您可以将其用作关键字;否则保留主键和自动生成的ID。
答案 2 :(得分:2)
我似乎在这里持有一个少数意见,让赞成和 downvoted 到目前的偶数0,但大多数人都没有意见(见上面的回应)似乎使保持id字段的大部分情况,并且downvoters甚至没有留下评论暗示为什么取消id这是一个坏主意。
在他们的辩护中,我自己的原始回复没有包含任何强有力的论据,为什么在某些情况下可以取消id属性(这似乎适用于OP)。也许这种无偿的反应本身就是一种不可回避的反应。
请教我和OP,通过留下评论赞成或反对 _systematic _ (我强调“系统”)需要在所有表中包含自动递增的非语义主键。答应我回来并添加到我的回复中,提供一个原因列表,列出为什么它可能对[再次,系统地]施加自动递增的PK有害。
我原来的回复: 你打赌!你可以删除这些!
在对数据库执行任何操作之前,请确保您有备份,特别是数据库大小很重要。
使用ALTER TABLE语句删除要删除的表中的id。具体
ALTER TABLE myTable DROP COLUMN id
(如果表有这样的约束,你还需要在删除id之前删除PK约束)
编辑(稍后补充)
在许多情况下,携带自动增加的ID密钥是没有意义的,无论这些密钥添加的相对较少的额外存储要求如何。
在所有这些情况下,潜在的含义是
数据中“本机”提供的密钥不一定需要是单个列密钥,它可以是复合密钥,尽管在这些情况下,人们可能希望更密切地研究情况,特别是整个密钥有点长。
以下是使用自动增加的主键代替本机或应用程序提供的密钥的一些缺点:
总而言之,只要存储能够承载人工主键的[相对最小]额外“权重”,我们应该包含并使用这样的密钥,这并不是没有自己的缺点。
最后一个考虑因素就是当我们不需要它们时很容易删除这些键,它们也可以很容易地添加,事后,当它/如果显然它们在某个特定用途中有用时情况。 这两种形式的重构(添加与删除自动增加的列)都没有风险,但也不是主要产品。
答案 3 :(得分:2)
我个人保留它们。如果您扩展数据库设计并需要引用此表,它们将在以后特别有用。
答案 4 :(得分:0)
是的,如果你能找到另一个主键。
你的桌子设计显然存在缺陷。例如,你有一个像这样的表
relation_id(PK), parent_id, child_id
。
众所周知,parent_id和child_id的组合是唯一的,然后您可以将主键指定为parent_id + child_id
,然后删除列relation_id。
应该有其他可能的情况,但请记住,主键可以帮助您快速定位数据,并帮助您使设计有意义。