从很久以前开始,由于几个原因,我已经明白没有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
字段是合理的。我是对的吗?
答案 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字段 主键是合理的。我是对的吗?
很可能。你只需要确保你
(MySQL can store trailing microseconds。)
在其他平台上,您可能会使用CHECK约束来强制执行这些要求,但MySQL不会强制执行CHECK约束。您需要编写触发器或撤消对表的权限,并要求更改以通过存储过程。