Предотвращение дублирования строк при использовании UUID для первичного ключа - PullRequest
0 голосов
/ 22 июля 2011

У меня есть таблица базы данных в 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 для первичного ключа, как показано в в этом руководстве )

Мой вопрос касается предотвращения дублирования записей. Мои повторяющиеся критерии следующие:

  • Дублирующиеся значения столбца в порядке. например name значение "Фред" может появляются более одного раза в таблице
  • Дублирующие строки (игнорируя key) не в порядке. то есть две строки не могут иметь одинаковые значения для name И startDate И data.

Как я вижу, у меня есть несколько вариантов:

  1. Используйте то, что я пропустил в конфигурации DB2, чтобы убедиться, что комбинации значений столбцов (т. Е. name И startDate И data) должны быть уникальными в таблице
  2. Я просто сделал плохой выбор первичного ключа. Должен ли я вместо этого хэшировать значение объединенных полей в хеш SHA-1 (это хороший / плохой выбор?), А затем использовать его в качестве первичного ключа. Если да, могу ли я просто объединить поля строк в одну длинную строку и использовать BouncyCastle, чтобы сделать для меня тяжелый ? 1031 *
  3. Перед выполнением INSERT найдите в таблице строку, которую я собираюсь вставить, и не вставляйте ее, если она уже существует. Я не знаю об эффективности этого (или даже как это сделать - мои знания по DB2 XML в настоящий момент немного отсутствуют - но, возможно, это стоит отдельного вопроса).
  4. Что-то еще?

1 Ответ

1 голос
/ 22 июля 2011

Вы можете добавить уникальное ограничение.Столбцы могут быть частью уникального ограничения в DB2, только если они не обнуляются.Другая проблема здесь - столбец данных типа XML.Столбец типа XML не может быть частью уникального ограничения.

Вы можете добавить уникальное ограничение для имени столбца и начальной даты следующим образом:

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-данных.Ищите «GENERATE KEY USING xmlpattern» для получения информации по этому вопросу.

...