Какие уникальные варианты полей в таблице - PullRequest
0 голосов
/ 01 июня 2018

Я пишу скрипт, который проверяет наличие уникальных конфликтов ограничений перед вставкой данных в таблицу.

Если не учитывать первичный ключ, существует ли больше вариантов, чем эти?

  1. Существует ли только одно уникальное поле в таблице
  2. Существует несколько уникальных полей в таблице
  3. Существует уникальное поле, которое являетсясоставной (уникальная комбинация полей)
  4. Комбинация (1 или 2) с 3

Имеет ли смысл вариант № 2?Используется ли это на практике или считается плохим дизайном?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Слово, которое отсутствует в вашем вопросе - КЛЮЧ.Таблица может иметь ноль, один или несколько ключей.В реляционной базе данных таблица должна иметь хотя бы один ключ, но СУБД SQL разрешают таблицы без ключей.

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

Ключ также может иметь нулевые атрибуты.Это имеет место для одноэлементных таблиц - таблиц, которые должны иметь (максимум) одну строку.Системная таблица DUAL в Oracle является хорошо известным примером.К сожалению, SQL не поддерживает синтаксис «пустых» ключей, но для достижения того же эффекта используются некоторые обходные пути.

Обычно данные проверяются по ключам, которые уже известны.Получение ключей из данных обычно не является полезным упражнением, если ваши данные действительно никогда не меняются.Если таблица имеет только 10 (ненулевых) атрибутов, то она может иметь максимум 252 ключей из 1024 возможных суперключей, поэтому проверка всех возможностей является довольно сложной проблемой.

0 голосов
/ 01 июня 2018

Просто чтобы дополнить все остальные комментарии, да, все эти варианты возможны и рекомендуются в соответствии с вашей бизнес-моделью .Бизнес-модель - это то, что управляет всеми ограничениями.Возьмите приведенный ниже пример:

create table employee (
  id int primary key not null,
  name varchar(50) not null,
  ssn varchar(10) not null,
  branch_id int not null,
  in_branch_serial int not null,
  constraint uq_name unique (name),
  constraint uq_ssn unique (ssn),
  constraint uq_employee_number unique (branch_id, in_branch_serial)
);

В этой таблице:

  • id уникален, поскольку является первичным ключом.
  • nameКроме того, мы решили, что хотели именно так.
  • ssn также уникален для нашей бизнес-модели.
  • Уникальная комбинация branch_id + in_branch_serial.Сотрудники в одной и той же ветке будут иметь одинаковые branch_id, но комбинация обоих столбцов будет уникальной.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...