2011-07-22 67 views
0

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

我的問題是防止重複條目之一。我的重複標準如下:

  • 重複的列值是可以的。例如值「Fred」可以 在表中多次出現
  • 重複的行(忽略key)不正確。即,對於namestartDatedata,兩行不能具有相同的值。

我看到它的方式,我有幾個選擇:

  1. 使用的東西,我在DB2配置遺漏,以確保該列值的組合(即namestartDatedata)必須在表中是唯一的
  2. 我只是簡單地選擇了主鍵。我是否應該將組合字段的值散列到SHA-1散列(這是一個好還是不好的選擇?),然後將其用作主鍵。如果是這樣,我可以將字段的字符串連接成一個長字符串,並使用BouncyCastle爲我執行heavy-lifting
  3. 在執行INSERT之前,請在表格中搜索我即將插入的行,如果已存在,請不要插入它。我不知道這種效率(甚至不知道如何去做 - 我的DB2 XML知識目前有點缺乏 - 但這也許值得另外一個問題)。
  4. 還有別的嗎?

回答

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生成密鑰」。

+0

可以在可爲空的列上進行獨特的約束;但你只能有一行NULL。只有主鍵約束需要NOT NULL。 –

+0

@ Ian Bjorhovde:我再次不同意你的看法(參見http://stackoverflow.com/questions/3828147/using-prepared-statement-without-row-number-and-over-functions-in-db2/3829806#評論-4070510)我在Linux上的DB2 v9.7上測試了這一點。如果列可以爲空,則DB2響應:不能是主鍵或唯一鍵的列,因爲它可以包含空值。SQLCODE = -542,SQLSTATE = 42831。你使用的是什麼DB2版本和操作系統? – boes

+0

如果有幫助,列總是不爲空(即我將始終有數據) – Catchwa