有没有办法在Access 2007中使多个列唯一?

时间:2015-06-08 18:41:15

标签: database ms-access ms-access-2007 unique-constraint

我目前正在尝试为我工作的地方建立一个数据库。我们将部分社会安全号码放入系统以使顾客分开,这样我们就知道谁是谁,我想知道是否有办法让这更容易。我们正在寻找一种方法来阻止人们使用彼此的社会保障卡[确实发生了什么事情],所以当我理解如何使单个列独特时,我想知道是否有办法使它成为所有的SSN列将是唯一的,因为会有多个。

主要SSN 配偶的SSN 儿童的SSN

有时最多有七八个孩子,他们都必须进入一个单独的专栏。那么有没有办法让所有这些SSN列彼此独特?如果没有在Access中,是否有一个程序可以做到这一点?我们目前正在使用MyDatabase,但我还没有找到在那里制作任何独特内容的方法。

1 个答案:

答案 0 :(得分:2)

你这是错误的方式。如果你有一个有19个孩子的家庭怎么办?您将需要21个SSN列。当您的设计大于您的设计允许出现时,您真的想要修改所有表单和报告吗?

唯一性问题:

  1. 您无法在所有SSN列上定义唯一的多列索引并完成调用。考虑序列:[A],[A,B],[A,B,C]。这些在你的索引中都是独一无二的,但显然A和B都是重复的,与你的意愿相反。
  2. 好的,那么如果您尝试使用带有连接的查询来解决8 SSN列唯一性问题呢?只是为了验证主要SSN是唯一的,您必须加入顾客表7次:MainSSN - > SpouseSSN - > Child1SSN - > ... - > Child8SSN。连接7次的1000行表上的笛卡尔积将进行1.0 * 10^21行比较。索引所有8列可能加速这一点,但是以大大增加的存储和大大减慢的插入和更新为代价。
  3. 并且,经过所有这些努力,您仍然无法确定配偶SSN是否在儿童SSN中不重复!为了完整起见,您必须检查Child1 vs. Children2-8,Child2 vs. Children3-8等。
  4. 总之,在8列中强制执行唯一性是不切实际的,更不用说合理的最大值,例如21。

    除了:以未加密的格式存储部分社会安全号码也是一个坏主意。它使得唯一性检查更有可能失败,并且可能违反法规。

    我建议修复:

    这是一个数据设计问题。我建议的不是横向(添加更多列),而是垂直(添加更多行的相关表)。 对于你的主表,我建议:

    Table: Patrons
    ==============
    Field       | Type        | Comment
    ------------------------------------------
    PatronID    | AutoNumber  | Primary Key
    PatronSSN   | String      | SSN Digest
    

    然后,你的配偶表:

    Table: PatronSpouses
    ====================
    Field           | Type        | Comment
    ------------------------------------------------------
    PatronSpouseID  | AutoNumber  | Primary Key
    PatronID        | Long        | Foreign Key to Patrons
    SpouseSSN       | String      | SSN Digest
    

    最后,你的孩子表:

    Table: PatronChildren
    =====================
    Field          | Type        | Comment
    ------------------------------------------------------
    PatronChildID  | AutoNumber  | Primary Key
    PatronID       | Long        | Foreign Key to Patrons
    ChildSSN       | String      | SSN Digest
    

    现在,定义索引:

    Table.Field             | Index Type
    -----------------------------------------
    Patrons.PatronSSN         (unique)
    PatronSpouses.SpouseSSN   (unique)
    PatronChildren.ChildSSN   (unique)
    

    接下来,您定义表关系:

    Foreign Table.Field     ==> Primary Table.Field   Relationship
    --------------------------------------------------------------
    PatronSpouses.PatronID  ==> Patrons.PatronID      (1 to 1)
    PatronChildren.PatronID ==> Patrons.PatronID      (1 to Many)
    

    优点:

    1. 您可以对每个表中的所有SSN进行自动唯一性检查。
    2. 您可以通过加入各自的SSN字段轻松地在表格之间交叉检查SSN。
    3. 唯一性检查永远不会比1.和2更复杂。
    4. 执行1.自动发生在表级。执行2仍然在代码/查询级别发生。
    5. 您的表单和报告现在可以处理任意数量的子项而无需进一步修改。诚然,初始设计变得更加复杂,但是当一个特别大的家庭走进来时,你永远不会被迫改变它。