Mar*_*n F 4 null ms-access primary-key unique-constraint
我有一个Engagement
带有四个字段的 Access 表:
Emp_id, Year, Week, Act_id
Run Code Online (Sandbox Code Playgroud)
它记录员工何时/曾参与某项活动。每个字段都是数字,每个字段都构成复合主键的一部分。应用程序的语义是每个条目(每个Emp_id
- Year
- Week
-Act_id
组合)必须是唯一的。也就是说,虽然员工通常会有不同的年周和不同的活动,但员工有时可以在不同的年周从事相同的活动,甚至可以在同一年的周从事不同的活动。不允许有空值。一切正常。
现在我需要扩展/修改语义以允许与任何给定员工活动相关的未知——或更恰当地说,未披露——年-周值。当然,尝试输入带有空的 Year-Week 的行会导致“索引或主键不能包含 Null 值”。所以我需要改变表格设计。
我尝试过的一件事是通过在“索引”窗口中关闭“主”(并保持“唯一”状态)将主键索引转换为非主索引。这正确地防止了年-周值非空的重复记录——但它允许年-周为空的重复记录。
例如,使用上述非主、唯一索引,允许以下数据:
Emp_id Year Week Act_id
7 2014 12 31 } Same activity,
7 2015 22 31 } different dates.
7 2015 33 32
7 2015 40 33 } Same dates,
7 2015 40 34 } different activities.
7 2016 2 36
7 38 } Different activities,
7 39 } undisclosed dates.
Run Code Online (Sandbox Code Playgroud)
随后不允许添加以下任何内容:
Emp_id Year Week Act_id
7 2014 12 31 } Both records are
7 2015 33 32 } duplicates of above.
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利(行为符合要求)。但是,随后允许以下两种添加方式,但不应:
Emp_id Year Week Act_id
7 38 } Both records are
7 39 } duplicates of above.
Run Code Online (Sandbox Code Playgroud)
这是为什么?
什么是解决这个问题的好方法,一方面,允许年和周等效于 null,另一方面,将每个Emp_id
- Year
- Week
-Act_id
组合限制为唯一?
我可以想到另外两个(未尝试过的)解决方案:
根据您的经验,在这种情况下有什么好的解决方案?
我知道复合主键中的可为空列有什么问题?和多列主键中的 NULL 值,它解释了某些事情,但没有提供解决方案。
我能给出的最强有力的建议是保持主键不可变,除非它对您的用例绝对不可行。您似乎在描述 2 个不同的数据集。
User-Actions
在给定 Period
(由 Year-Week 的组合键定义)期间拍摄User-Actions
在未知期间拍摄 Period
我的初步印象是未知时期必须是不同的数据集。当然,如果您不知道某个操作何时发生,那么您还没有足够的信息将其从其暂存环境移动到User-Action-Period
唯一标识符所在的表中。我不太了解 MS Access,无法评论该环境中空键的细节,但我强烈建议您以这样的方式为自己定义数据模型,以便您知道是否需要包含“等效于空” "同一张表上的键控记录。
根据您的描述,问题似乎是在尝试插入 a 的多个实例时出现的User-Action
,其中Period
发生的情况未知。再一次,如果您不知道足够的信息来唯一标识 的提交时间User-Action
,则将您正在记录的指标与其他地方大致相同是合适的,User-Action
直到您可以适当地确定 thisUser-Action
与User-Actions
发生在另一个键上的其他类似事件之间的关系- 时间Period
。
我看到了两条前进的道路:
示例:操作是“待处理”或“待完成”。用户将始终提交未来/未完成时期的数据。
解决方案:选择您最喜欢的将时间段键入为“等效于空”的方法,并使键列不可为空。您可以继续将这些数据集存储在同一个表中
陷阱:如果用户提交了一个有承诺期的动作,而同一时间存在未知期User-Action
,你可能会遇到这样的情况,即数据在期限已知的情况下提交,但其他数据已经提交了未知期(恰好是同一个 ) 留在“未知时期”状态并丢失该User-Action-Time
记录,用户不会立即知道原因。
示例:用户可以使用不同标识符在未知时间段内唯一标识相同的操作类型。
解决方案:您必须定义另一种数据键控方式(操作发生的时间是其他多键记录的度量)。允许用户将数据提交到这个单独存储的数据集,并User-Action-Time
使用适当的逻辑将其合并到您的周期数据集中。这是更多的工作,但如果数据集是真正分开的,就没有办法解决。