Установка значений по умолчанию
Когда вы вставляете строку в таблицу без указания значений в ней для каждого поля, SQL должен иметь значение по умолчанию для включения его в определенное поле, или же команда будет отклонена. Наиболее общим значением по умолчанию является NULL. Это — значение по умолчанию для любого столбца, которому не было дано ограничение NOT NULL или который имел другое назначение по умолчанию.
Значение DEFAULT (ПО УМОЛЧАНИЮ) указывается в команде CREATE TABLE тем же способом, что и ограничение столбца, хотя, с технической точки зрения, значение DEFAULT не ограничительного свойства — оно не ограничивает значения, которые вы можете вводить, а просто определяет, что может случиться, если вы не введете любое из них.
Предположим, что вы работаете в офисе Нью-Йорка, и подавляющее большинство ваших продавцов живут в Нью-Йорке. Вы можете указать Нью-Йорк в качестве значения поля city, по умолчанию, для вашей таблицы Продавцов:
CREATE TABLE Salespeople (
snum integer NOT NULL UNIQUE,
sname char(10) NOT NULL UNIQUE,
city char(10) DEFAULT = 'New York',
comm decimal CHECK (comm < 1));
Конечно, вводить значение Нью-Йорк в таблицу каждый раз, когда назначается новый продавец, не такая уж необходимость, и можно просто пренебречь им (не вводя его) даже если оно должно иметь некоторое значение. Значение по умолчанию такого типа, более предпочтительно, чем, например, длинный конторский номер, указывающий на ваше собственное ведомство, в таблице Заказов.
Длинные числовые значения более расположены к ошибке, поэтому если подавляющее большинство (или все) ваших Заказов должны иметь ваш собственный конторский номер, желательно устанавливать для них значение по умолчанию.
Другой способ использовать значение по умолчанию — это использовать его как альтернативу для NULL. Так как NULL (фактически) неверен при любом сравнении, ином, чем IS NULL, он может быть исключен с помощью большинства предикатов. Иногда вам нужно видеть пустые значения ваших полей, не обрабатывая их каким-то определенным образом. Вы можете установить значение по умолчанию, типа нуль или пробел, которые функционально меньше по значению, чем просто не установленное значение — пустое значение (NULL). Различие между ними и обычным NULL в том, что SQL будет обрабатывать их так же, как и любое другое значение.
Предположим, что заказчикам не назначены оценки изначально. Каждые шесть месяцев, вы повышаете оценку всем вашим заказчикам, имеющим оценку ниже средней, включая и тех, кто предварительно не имел никакого назначения оценки. Если вы хотите выбрать всех этих заказчиков как группу, в следующий запрос не будут включены все заказчики с оценкой = NULL:
SELECT *
FROM Customers
WHERE rating <= 100;
Однако если вы назначили в поле rating значение по умолчанию = 0, заказчики без оценок будут выбраны наряду с другими. Приоритет каждого метода зависит от ситуации.
Если вы будете делать запрос с помощью поля оценки, то захотите ли Вы включить строки без значений, или исключите их?
Другая характеристика значений по умолчанию этого типа, позволит объявить Вам поле оценки — какNOT NULL.
Если вы используете его по умолчанию, чтобы избежать значений = NULL, то это — вероятно хорошая защита от ошибок.
Вы можете также использовать ограничения UNIQUE или PRIMARY KEY в этом поле. Если вы сделаете это, то, имеете в виду, что только одна строка одновременно может иметь значение по умолчанию. Любую строку, которая содержит значение по умолчанию, нужно будет модифицировать прежде, чем другая строка с установкой по умолчанию будет вставлена. Это не так как вы обычно используете значения по умолчанию, поэтому ограничения UNIQUE и PRIMARY KEY (особенно последнее) обычно не устанавливаются для строк со значениями по умолчанию.
Резюме
Вы теперь владеете несколькими способами управления значениями, которые могут быть введены в ваши таблицы. Вы можете использовать ограничение NOT NULL, чтобы исключать NULL, ограничение UNIQUE, чтобы вынуждать все значения в группе из одного или более столбцов отличаться друг от друга, ограничение PRIMARY KEY, для того чтобы делать в основном то же самое, что и UNIQUE, но с различным окончанием, и, наконец, ограничение CHECK для определения ваших собственных, сделанных на заказ условий, чтобы значения, встреченные перед ними, могли бы быть введены. Кроме того, вы можете использовать предложение DEFAULT, которое будет автоматически вставлять значение по умолчанию в любое поле с именем, не указанным в INSERT, так же как вставляется значение NULL, когда предложение DEFAULT не установлено и отсутствует ограничение NOT NULL.
ОграниченияFOREIGN KEYилиREFERENCES, о которых вы узнаете в Главе 19, очень похожи на них, за исключением того, что они связывают группу из одного или более полей с другой группой, и таким образом сразу воздействуют на значения, которые могут быть введены в любую из этих групп.
Работа с SQL
1. Создайте таблицу Заказов, так чтобы все значения поля onum, а также все комбинации полей cnum и snum отличались друг от друга, и так чтобы значения NULL исключались из поля даты.
2. Создайте таблицу Продавцов так, чтобы комиссионные по умолчанию составляли 10%, не разрешались значения NULL, чтобы поле snum являлось первичным ключом, и чтобы все имена были в алфавитном порядке между A и M включительно (учитывая, что все имена будут напечатаны в верхнем регистре).
3. Создайте таблицу Заказов, будучи уверенными в том, что поле onum больше, чем поле cnum, а cnum больше чем snum. Запрещены значения NULL в любом из этих трех полей.
(См. Приложение A для ответов.)