Опубликован: 11.12.2006 | Уровень: специалист | Доступ: платный

Лекция 10: Создание таблиц баз данных

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >

Применение null-значений

Null-значение (null value) – это неизвестное значение, для которого применяется обозначение NULL. Способность хранить null-значения (nullability) – это свойство, благодаря которому колонка способна либо хранить null -значения, либо отвергать их. Null -значение в колонке обычно означает, что для данной строки этой колонки нет данных, потому что значение неизвестно, либо не имеет смысла, либо не задано или будет задано в будущем. Null -значения – это не пустые значения и не значения числа 0, их настоящие значения неизвестны (unknown), поэтому никакие два null -значения не являются равными.

Колонки, способные хранить null -значения, могут оказаться полезными в случаях, когда необходимая информация пока что недоступна для вас (это может быть, например, инициал для среднего имени покупателей). Что должно храниться в этой колонке для записи о некотором покупателе, который не имеет среднего имени, и поэтому не имеет среднего инициала? Если в этой колонке разрешено применять значения NULL, то null -значение будет правильным выбором и будет иметь смысл – благодаря этому вы поймете, что информация из данной колонки не имеет смысла.

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

Дополнительная информация. Более подробную информацию вы можете получить, открыв заголовок Null Values индекса Books Online, а затем выбрав тему "Comparison Search Conditions" (Условия для поиска по сравнению). Также прочитайте раздел "Добавление свойства IDENTITY" далее в данной лекции.

Прекрасной альтернативой применению null -значений в колонке является задание значения по умолчанию (default value) для этой колонки. Если значение не было задано при вводе строки, то в колонку записывается значение по умолчанию. (Более подробно о применении значений по умолчанию написано в "Создание и использование умолчаний, ограничений и правил" .) Если вы определите эту колонку, как способную хранить null -значения, т.е. два случая, когда колонка получит значение NULL:

  • Если в таблицу добавляется строка, но не заданы данные для колонки, способной хранить null -значения, то SQL Server присвоит колонке значение NULL (если только для этой колонки не было задано значение по умолчанию).
  • Пользователь может ввести слово "NULL" без кавычек (с кавычками будет введена текстовая строка "NULL").
Создание таблицы Product_Info с применением null-значений

Давайте вернемся к нашему примеру с таблицей Product_Info и зададим для каждой колонки возможность хранить null -значения. Если вы хотите, чтобы в колонке разрешалось хранить null -значения, то после типа данных надо добавить слово NULL. Если вы не хотите, чтобы разрешалось хранить null -значения, то после типа данных надо добавить слово NOT NULL. Мы рекомендуем всегда указывать, разрешается ли хранить в колонке null -значения, за исключением лишь случаев, когда применяются пользовательские типы данных (они уже заданы NULL или с NOT NULL ). Это поможет вам выработать привычку обращать внимание на необходимость способности к хранению null -значений в тех или иных колонках.

Дополнительная информация. Чтобы узнать, какова будет применяемая по умолчанию способность хранить null -значения, когда NULL или NOT NULL не заданы, обратитесь к теме "CREATE TABLE" в Books Online и, пользуясь "прокруткой", перейдите к разделу "Nullability Rules Within a Table Definition" (Задание таблиц: правила, определяющие способность к хранению null -значений). Явное задание NULL или NOT NULL будет иметь преимущество по отношению к этим правилам.

Пускай в нашем примере с таблицей Product_Info null -значения будет разрешено применять только в колонке для описаний продуктов. Мы не указали способность к хранению null-значений для типа данных brand_type, так как его способность к хранению null -значений уже была задана (как NOT NULL ) при создании этого пользовательского типа данных. Новый оператор CREATE TABLE будет выглядеть так:

USE MyDB 
GO
DROP TABLE Product_Info
GO 
CREATE TABLE Product_Info 
( 
Product_ID         		smallint NOT NULL,
Product_Name   	char(20) NOT NULL, 
Description         		char(30) NULL, 
Price                   smallmoney NOT NULL, 
Brand_ID            		brand_type 

) 
GO

Теперь, если описание продукта (Description) не будет задано, а значения остальных четырех полей – заданы, то в таблицу будет введена новая строка со значением NULL для элемента данных, находящегося в колонке Description. Вы должны будете ввести значения для четырех остальных колонок, не допускающих ввода значений NULL (колонок Product_ID, Product_Name, Price и Brand_ID ). Если данные для какой-либо из этих колонок не ввести, то попытка ввести новую строку будет неуспешной.

Добавление свойства IDENTITY

Когда вы создаете таблицу, вы можете задать одну из колонок как идентифицирующую колонку (identity column), добавив к определению колонки свойство IDENTITY. Если колонка создается со свойством IDENTITY, то SQL Server автоматически генерирует для этой колонки значение строки, рассчитываемое по начальному значению (seed value) и значению приращения (increment value). Начальное значение (seed) является значением идентификации для первой строки, вставленной в таблицу. Приращение (increment) – это величина, на которую SQL Server увеличивает значение идентификации для последовательно вводимых строк. Каждый раз при вводе строки SQL Server присваивает текущее значение идентификации элементу данных в колонке идентификации, вводимому в новую строку. Следующая введенная строка получит значение идентификации, большее, чем текущее максимальное значение идентификации на величину приращения. Таким образом, каждая вводимая строка получит уникальное значение идентификации. Свойство идентификации полезно для создания колонок, в которых каждая строка должна иметь уникальный идентификатор, например, для колонки Product_ID. Если вы разрешите SQL Server генерировать идентифицирующие значения для вводимых строк, то это окажется проще, чем следить за правильностью ввода последовательных значений. Идентифицирующие колонки обычно применяются в ограничениях первичного ключа в таблицах, благодаря которым возможна уникальная идентификация строк. (Про ограничения первичного ключа см. "Создание и использование умолчаний, ограничений и правил" .)

Например, если вы зададите IDENTITY(0, 10), то значение идентифицирующей колонки для первой введенной строки будет равно 0, для второй строки будет равно 10, для третьей строки – 20, и т.д. Если начальное значение или приращение не задать, то для них будут применяться значения по умолчанию, равные 1 и 1. Вы можете задать как оба этих параметра, так и один из них. Идентифицирующие колонки не могут содержать значения по умолчанию и для них не разрешено применение null -значений. В каждой из таблиц может иметься только одна идентифицирующая колонка.

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

SET IDENTITY_INSERT имя_таблицы ON

При помощи этого оператора можно вставить строку и назначить нужное вам значение идентифицирующей колонки. Закончив ввод строки, нужно отменить возможность вставки в идентифицирующую колонку при помощи такого оператора:

SET IDENTITY_INSERT имя_таблицы OFF

После этого, SQL Server, в качестве начального значения, применяемого при добавлении следующих строк, возьмет самое большое значение из данной колонки.

Добавление свойства IDENTITY для таблицы Product_Info

Давайте добавим свойство IDENTITY в таблицу Product_Info. Вместо того, чтобы вводить данные в колонку Product_ID , мы сделаем ее идентифицирующей колонкой, и пусть SQL Server автоматически генерирует ее значения, обеспечивая их уникальность. Ниже показан код T-SQL, который создаст такую таблицу:

USE MyDB 
GO 
DROP TABLE Product_Info
GO 
CREATE TABLE Product_Info 
( 
Product_ID         		smallint IDENTITY(1, 1) NOT NULL,
Product_Name   	char(20) NOT NULL, 
Description         		char(30) NULL, 
Price                   	smallmoney NOT NULL, 
Brand_ID            		brand_type 
 
) 
GO

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

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Максим Ерохин
Максим Ерохин
Россия, г. Санкт-Петербург
Татьяна Лубинец
Татьяна Лубинец
Россия, Уфа, Уфимский авиационный институт, 1987