使用UUID作为主键时防止重复行

时间:2011-07-22 05:51:00

标签: xml db2 duplicates uuid

我在DB2(v9.5)中有一个数据库表,如下所示:

CREATE TABLE license(key CHAR(16) FOR BIT DATA NOT NULL PRIMARY KEY, 
                     name VARCHAR(32) not null,
                     startDate TIMESTAMP not null, 
                     data XML);

(我正在使用UUID作为主键,如this guide所示)

我的问题是防止重复输入。我的重复标准如下:

  • 重复的列值没问题。例如name值“Fred”可以 表中不止一次出现
  • 重复行(忽略key)不行。即,namestartDate以及data的两行不能具有相同的值。

我看到它的方式我有几个选择:

  1. 使用我在DB2配置中遗漏的内容来确保列值的组合(即namestartDate AND data)在表格中必须是唯一的
  2. 我只是做了一个糟糕的主键选择。我是否应该将组合字段的值散列为SHA-1哈希(这是一个好/坏的选择?)然后将其用作主键。如果是这样,我可以将字段串联连接到一个长字符串中,并使用BouncyCastle为我做heavy-lifting吗?
  3. 在执行INSERT之前,在表中搜索我要插入的行,如果已存在则不插入。我不知道这个的效率(甚至怎么做 - 我的DB2 XML知识目前有点缺乏 - 但这可能值得一个单独的问题。)
  4. 别的什么?

1 个答案:

答案 0 :(得分:1)

您可以添加唯一约束。只有当列不可为空时,列才能成为DB2中唯一约束的一部分。这里的另一个问题是XML类型的数据列。 XML类型的列不能是唯一约束的一部分。

您可以为列名称和startdate添加唯一约束,如下所示:

CREATE TABLE license(
    key CHAR(16) FOR BIT DATA NOT NULL PRIMARY KEY,
    name VARCHAR(32) not null,
    startDate TIMESTAMP not null,
    data XML,
    unique(name, startDate)
);

您可以将XML列的一部分添加到唯一约束中。我不能在这里给出一个例子,因为它取决于你的xml数据的具体内容。搜索“生成密钥使用xmlpattern”以获取有关此主题的信息。