代码之家  ›  专栏  ›  技术社区  ›  Guy

日期时间字段上的SQL Server主键

  •  6
  • Guy  · 技术社区  · 14 年前

    我正在SQL Server 2005中创建一个新表,需要2个字段:datetime和myvalue(int32)。日期时间字段将是唯一的,因此我将对其设置唯一约束。

    哪个桌子结构更好,为什么?

    myindex(pk,int)
    mydate(日期时间)(ix_niquekey)
    MyValue(int)

    mydate(pk,日期时间)
    MyValue(int)

    我的感觉是我不想在这个表中有一个人工的pk(myindex),因为它是不必要的,而且因为日期是唯一的,所以我将使用它们来访问任何记录。然而,也许有一个人工的pk更具性能…?

    4 回复  |  直到 12 年前
        1
  •  10
  •   Larry Lustig    12 年前

    当你说日期是独一无二的时候,你是说你 认为 它们将是唯一的,或者它们的唯一性是由问题的陈述来保证的?根据我的经验,有些事情并没有想象的那么独特(美国社会保险号码就是一个例子)。

    如果日期值不保证唯一,则应添加整数键。

    如果日期值被保证是唯一的,它们会改变吗?如果它们确实发生了更改,那么它们是否被其他表引用?如果两个答案都是“是”,您可能应该添加整数键。

    如果保证日期值是唯一的,并且不更改或不被引用,则可以将其用于键。常规日期时间为8字节,标准整数值为4字节,这可能对索引产生轻微影响。如果日期值只是日期,或者精确到分钟或更少,并且在类型允许的更受限制的范围内,则可以使用smalldatetime并将这些索引值减少到4个字节。

        2
  •  2
  •   OMG Ponies    14 年前

    如果datetime值将由数据库ie填充:

    INSERT INTO your_table
      (mydate, myvalue)
    VALUES
      (GETDATE(), 1234)
    

    …然后是的,使 mydate 列的主键是理想的解决方案。如果申请提供日期,即:

    INSERT INTO your_table
      (mydate, myvalue)
    VALUES
      (@my_date_value, 1234)
    

    …假设数据库没有提供@my_date_值-不,不理想。从数据库以外的任何地方获取的日期时间不能保证基于插入的数据是准确的。

        3
  •  1
  •   dkretz    14 年前

    不,你的直觉是正确的。只要没有人能把两个(或者我认为更多)同时发生的事件放在你的数据收集过程中,你就是个笨蛋。

        4
  •  1
  •   Mitch Wheat Scott Wisniewski    14 年前

    如果您保证日期时间总是唯一的(考虑时间组件的分辨率),那么在日期时间列上创建主键是一个不错的选择。

    如果只想增加日期时间,那么在主键列上创建聚集索引也是一个不错的选择。