Могут ли ограничения БД игнорировать существующие записи и применяться только для новых данных? - PullRequest
1 голос
/ 26 января 2009

Я хочу узнать ответ для разных двигателей БД, но в нашем случае; у нас есть некоторые записи, которые не являются уникальными для столбца, и теперь мы хотим сделать этот столбец уникальным, что заставляет нас удалять дублирующиеся значения. Мы используем Oracle 10g. Это разумно? Или это что-то вроде заявления goto :)? Должны ли мы действительно удалить? Что если бы у нас были миллионы записей?

Ответы [ 5 ]

2 голосов
/ 26 января 2009

Чтобы ответить на вопрос в том виде, в каком он был опубликован: Нет, это невозможно сделать ни на одной СУБД, о которой я знаю .

Однако, как и большинство вещей, вы можете обойти это, выполнив следующее.

Создание составного ключа с новым столбцом и существующим столбцом

Вы можете сделать его уникальным, не удаляя ничего, добавив новый столбец, назовите его PartialKey.

Для существующих строк вы устанавливаете для PartialKey уникальное значение (начиная с нуля).

Создайте уникальное ограничение для существующего столбца и PartialKey (вы можете сделать это, поскольку каждая из этих строк теперь будет уникальной).

Для новых строк используйте только значение по умолчанию Zero для PartialKey (поскольку ноль уже использовался), это приведет к тому, что в существующем столбце будут отсутствовать значения в таблице.

ВАЖНОЕ РЕДАКТИРОВАНИЕ

Это слабо - если вы удаляете строку с частичным ключом 0. Теперь можно добавить еще одну строку со значением, которое уже находится в существующем столбце, поскольку 0 в частичном ключе гарантирует уникальность.

Вы должны убедиться, что либо

  1. Вы никогда не удаляете строку с частичный ключ 0
  2. У вас всегда есть пустая строка с частичный ключ 0, и вы никогда не удаляете это (или вы автоматически вставляете его автоматически)

Редактировать: укусить пулю и очистить данные

Если, как вы сказали, вы только что поняли, что столбец должен быть уникальным, вам следует (если возможно) очистить данные. Вышеупомянутый подход является хаком, и вы обнаружите, что пишете больше хаков при доступе к таблице (вы можете обнаружить, что у вас есть два набора логики для работы с запросами к этой таблице, один для столбца, где столбец уникален, а другой для это НЕ. Я бы убрал это сейчас, или он вернется и укусит тебя в задницу тысячу раз.

2 голосов
/ 26 января 2009

Это можно сделать в SQL Server.

Когда вы создаете проверочное ограничение, Вы можете установить опцию, чтобы применить его либо только для новых данных, либо для существующих данные также. Возможность применения ограничение только для новых данных полезно, когда вы знаете, что существующий данные уже соответствуют новой проверке ограничение, или когда бизнес-правило требует применения ограничения только с этого момента.

например

ALTER TABLE myTable 
WITH NOCHECK
ADD CONSTRAINT myConstraint CHECK ( column > 100 )
1 голос
/ 26 января 2009

Вы можете сделать это, используя состояние ограничения NOVALIDATE ENABLE, но удаление является гораздо более предпочтительным способом.

1 голос
/ 26 января 2009

Вы должны установить свои записи прямо перед добавлением ограничений.

0 голосов
/ 27 января 2009

В Oracle вы можете поместить ограничение в состояние разрешения novalidate. Когда ограничение находится в состоянии разрешения novalidate, все последующие операторы проверяются на соответствие ограничению. Однако любые существующие данные в таблице не проверяются. Таблица с включенными ограничениями novalidated может содержать недопустимые данные, но добавить в нее новые недопустимые данные невозможно. Включение ограничений в состоянии без проверки правильности наиболее полезно в конфигурациях хранилища данных, которые загружают действительные данные OLTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...