TIME列作为主键

时间:2014-06-26 15:23:10

标签: mysql primary-key

从很久以前开始,由于几个原因,我已经明白没有DATETIME列不应该成为表的主键的一部分。在这些原因之间,鉴于该领域的高精度,我认为这是一个坏主意。例如,2014-06-26 15:35:12不匹配2014-06-26 15:35:13

Use timestamp(or datetime) as part of primary key (or part of clustered index)这样的问题似乎支持这个"恐惧症"。

但是我现在面临一个非常具体的问题:我想将一些函数值映射到MySQL表中

f:(TimeInDay,TimeInDay) -> Integer

其中参数表示同一天内的时间间隔(具有第二精度)。 唯一(TimeInDay,TimeInDay)对会产生具体的输出值。所以我来到这个表结构:

CREATE TABLE sessions_schedule
(
    tIni TIME NOT NULL,
    tEnd TIME NOT NULL,
    X  tinyInt,
    CONSTRAINT pk PRIMARY KEY (tIni, tEnd)
);

TIME组成主键的地方。

MySQL online manual我找到了:

  

MySQL以多种格式识别TIME值,......其中一些   格式可以包括最多的尾随小数秒部分   微秒(6位)精度。虽然这个小部分是   识别出来,它会从存储在TIME列中的值中丢弃。

因此,在我看来,在这种情况下,在主键中包含TIME字段是合理的。我是对的吗?

1 个答案:

答案 0 :(得分:3)

  从很久以前,因为几个原因,我已经明白了   没有DATETIME列不应该成为a的主键的一部分   表。

对于关系模型而言,情况并非如此,一般而言,SQL并不是这样,特别是MySQL并非如此。

  

在这些原因之间,我认为这是一个坏主意   这个领域的精确度。例如,2014-06-26 15:35:12将不匹配   2014-06-26 15:35:13。

你的榜样不是很好。考虑使用整数。你期望整数3与整数4匹配吗?当然不是。那么为什么你会认为'2014-06-26 15:35:12'会匹配'2014-06-26 15:35:13'?他们是不同的值。不同的值不应匹配

  

所以,在我看来,在这种情况下,包含TIME字段   主键是合理的。我是对的吗?

很可能。你只需要确保你

  • 不存储任何比第二个更精确的值,
  • tIni在tEnd之前。

MySQL can store trailing microseconds。)

在其他平台上,您可能会使用CHECK约束来强制执行这些要求,但MySQL不会强制执行CHECK约束。您需要编写触发器或撤消对表的权限,并要求更改以通过存储过程。