loading..
Русский    English
19:34
листать

Категорная целостность или целостность сущностей стр. 1

Категорная целостность означает, что каждый объект, определяемый строкой в таблице, должен быть отличим от любого другого объекта. Иными словами, должен быть такой набор атрибутов, уникальная комбинация значений которого позволит нам отличить один объект от другого. Такой набор атрибутов, однозначно идентифицирующий объект, называется потенциальным ключом. Он не может содержать NULL-значения, поскольку это не даст нам возможности идентифицировать объект (как, скажем, книгу с неизвестным названием).

Потенциальных ключей у таблицы может быть несколько. Например, человека можно идентифицировать по номеру паспорта, номеру страхового свидетельства, ИНН, номеру водительских прав и т.д.

Для обеспечения категорной целостности в языке SQL существуют спецификации PRIMARY KEY (первичный ключ) и UNIQUE (уникальный ключ). Первичный ключ может быть только один в таблице, уникальных же ключей может быть несколько. Т.е. у нас есть возможность для одного из потенциальных ключей задать спецификацию PRIMARY KEY, а для остальных – UNIQUE.

Что в нашем случае может послужить первичным ключом? Поскольку у одного производителя может быть много моделей, и он, соответственно, неоднократно может присутствовать в данных таблицы Product, то столбец maker не может являться кандидатом на роль первичного ключа. Аналогично свойством уникальности не обладает и атрибут type.

Уникальным же является номер модели. Это единственный кандидат на роль первичного ключа. Других потенциальных ключей в таблице нет. Чтобы доказать это, можно рассмотреть все остальные комбинации столбцов и показать, что они не гарантируют нам идентификации объекта. В частности, комбинация значений из трех столбцов в приведенном выше примере данных является уникальной, но, тем не менее, не идентифицирует модель 1232.

Давайте создадим первичный ключ. В языке SQL есть возможность изменить структуру существующей таблицы при помощи команды ALTER TABLE. Однако давайте будем дозировать новую информацию, поэтому сейчас будет проще пересоздать таблицу, т.е. удалить ее и создать заново с первичным ключом. Удалить таблицу просто (как говорится, ломать – не строить), для этого достаточно выполнить оператор DROP TABLE <имя таблицы>. Итак,

  1. DROP TABLE Product;
  2. CREATE TABLE Product (
  3. maker varchar(10),
  4. model varchar(50) PRIMARY KEY,
  5. type varchar(50)
  6. );

Мы включили спецификацию первичного ключа в определение столбца. Но можно было это сделать отдельным ограничением:

  1. CONSTRAINT <имя ограничения> PRIMARY KEY (<список столбцов, являющихся первичным ключом>)

При этом наш код будет выглядеть так (опять предварительно удаляем ранее созданную таблицу):

  1. DROP TABLE Product;
  2. CREATE TABLE Product (
  3. maker varchar(10),
  4. model varchar(50),
  5. type varchar(50),
  6. CONSTRAINT product_PK PRIMARY KEY (model)
  7. );

Теперь сама СУБД будет следить за тем, чтобы значения первичного ключа не повторялись и не содержали NULL. Если мы выполним вставку при помощи ранее приведенного оператора INSERT, то получим такое сообщение об ошибке:

Violation of PRIMARY KEY constraint 'product_PK'. Cannot insert duplicate key in object 'Product'. The duplicate key value is (1232).

(Нарушение ограничения первичного ключа 'product_PK'. Нельзя вставить дубликат ключа в объект 'Product’. Дублирующееся значение ключа (1232).)

Если мы исправим ошибку ввода и укажем правильный номер модели принтера:

  1. INSERT INTO product VALUES
  2. ('A',    '1232',    'PC'),
  3. ('A',    '3001',    'Printer'),
  4. (NULL,    NULL,    NULL);

То получим другую ошибку, связанную с неопределенностью значения первичного ключа:

Cannot insert the value NULL into column 'model', table 'Product'; column does not allow nulls. INSERT fails.

(Невозможно вставить NULL в столбец 'model', table 'Product'; столбец не допускает NULL-значения. INSERT не выполнен.)

Оператор

  1. INSERT INTO product VALUES
  2. ('A',    '1232',    'PC'),
  3. ('A',    '3001',    'Printer'),
  4. (NULL,    '2000',    NULL);
отработает без ошибок.

Bookmark and Share
Страницы: 1 2
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE Convert COUNT CROSS APPLY CTE DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MONTH MySQL NOT Больше тэгов
Учебник обновлялся
вчера
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100