如果我有一个UNIQUE字段INT,是否需要具有自动增量的主键ID?

时间:2011-04-14 20:31:04

标签: mysql

我想在表中存储一个IP ADDRESS列表,以便稍后检查我的系统中是否已经使用了某些IP。

我想将ip存储在longip模式下(signed int)。并且由于每个IP都是唯一的,我想知道是否需要有一个质量关键字段(id,带有自动增量)或者它的okey(以及更好)只使用我的longip字段作为主键。

3 个答案:

答案 0 :(得分:2)

如果将来你必须使用密钥将它与另一个表连接,那么另一个表应该包含所有的数字,这就浪费了很多空间。

例如,你有一个“计算机”表

在该表中,您已经使用ip进行计算。加入你需要一把钥匙吗?所以,如果你通过密钥加入,你应该拥有计算机ID和密钥(在这种情况下是ip)

我强烈建议使用带有自动增量的更简单的id,就像它自大型机(as400),iSeries等以来所做的那样。

答案 1 :(得分:1)

我认为问题answer的Marc_s'When not to use surrogate primary keys?可以指导我们

  

我会说以下标准必须   满足:

     
      
  • 你的自然键必须绝对,积极,   允许无例外,唯一   (名称,社会保障等   数字等通常似乎是独一无二的 - 但实际上并非如此)

  •   
  • 您的自然键应该与INT一样小,例如没有多少   超过4个字节(不要使用   VARCHAR(50)为你的PK,和   尤其不适用于您的群集密钥   在SQL Server中!)

  •   
  • 你的自然键应该是稳定的,例如永远不会改变(好吧,用ISO   国家代码,这几乎是给定的 - 除非像南斯拉夫或苏联这样的国家崩溃,或者像两个德国人团结一样 - 但这种情况非常罕见)

  •   
     

如果满足这些条件,您可以   考虑一个自然的关键作为你的PK -   但这应该是2%的例外   所有的表 - 不是常态。

所以我想你应该使用代理主键。如果您想要

,可以随时使用IP作为唯一键

因为你正在使用你指出的longip可能没问题。

答案 2 :(得分:1)

几乎每次你开始使用自然键时,你最后都会后悔。它的墨菲定律会发生一些事情。免除麻烦,只需添加ID列。

如果是自动增量,你不喜欢只使用uuid。 MySql有一个uuid函数,可以轻松实现。