Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5365 / 282 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00

Лекция 20: Расширенное описание T-SQL

Пропуск значений колонок

В первом примере оператора INSERT в предыдущем разделе мы могли бы пропустить значения, а также имена колонок для колонок price и item_desc, поскольку для них заданы значения по умолчанию. Если пропустить значение для какой-либо колонки, то мы должны включить в список_колонок имена оставшихся колонок, иначе SQL Server сопоставит перечисленные значения с колонками в порядке, указанном при определении колонок в таблице.

Например, предположим, что мы пропустим значение колонки price и вообще не укажем список_колонок, как в следующем запросе:

INSERT INTO items
VALUES ('junk food', 2, 'fried pork skins')
GO

SQL Server попытается поместить значение, заданное для item_desc ( fried pork skins ; третье значение в списке), в колонку price (третья колонка в таблице). В результате появится сообщение об ошибке, поскольку fried pork skins – это данные типа char, в то время как для колонки price был указан тип данных smallmoney. Это несовместимые типы данных. Сообщение об ошибке будет выведено в следующей форме:

Msg 213, Level 16, State 4, Server NTSERVER, Line 1
Insert Error: Column name or number of supplied values
does not match table definition.
(Имя колонки или количество представленных значений не соответствуют определению таблицы)

А теперь предположим, что тип данных для значения fried pork skins был бы совместим с типом данных для колонки price, и представим себе, как это повлияло бы на целостность таблицы. SQL Server поместил бы это значение в неверную колонку, что привело бы к несогласованности данных в таблице.

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

Чтобы избежать ошибок, связанных с несовместимыми типами данных, указывайте имена в списке_колонок в соответствии с порядком соответствующих значений, как это показано ниже:

INSERT INTO items
    (item_category, item_id, item_desc)
VALUES ('junk food', 2, 'fried pork skins')
GO

Поскольку мы не указали цену, в колонку price для данной строки будет помещено значение NULL. А теперь выполните следующий оператор SELECT:

SELECT * FROM items

Вы увидите следующий набор результатов: (в который войдут две введенные нами строки). Отметим, что в колонке price находится значение NULL.

item_category     item_id   price         item_desc
------------------------------------------------------------------
health food         1        4.0000        tofu 6 oz. 
junk food           2       NULL          fried pork skins

А теперь добавим другую строку, не указывая значений для колонок price и item_desc, как это показано ниже:

INSERT INTO items
    (item_category, item_id) 
VALUES ('toys', 3) 
GO

Набор результатов отдельно для этой строки можно получить с помощью следующего запроса:

SELECT * FROM items WHERE item_id = 3

Набор результатов будет представлен в следующей форме:

item_category     item_id   price       item_desc
----------------------------------------------------------
toys              3         NULL        No desc

Отметим, что в колонках price и item_desc находятся соответственно значения NULL и No desc. Вы можете изменить эти значения с помощью оператора UPDATE, как будет показано ниже в этой лекции.

SQL Server автоматически задает значения (когда они не указаны) для четырех типов колонок: для колонок, допускающих пустые значения ( null ), для колонок с заданным значением по умолчанию, для колонок со свойством identity и колонок с временными метками ( timestamp ). Мы уже видели, что происходит с колонками первых двух типов. Колонка identity получает следующее по порядку идентифицирующее значение, в колонку временной метки заносится текущее значение временной метки. (Эти типы колонок описаны в "лекции 10" .) В большинстве случае вы не можете вручную помещать значения данных в эти два типа колонок.

Примечание. Будьте осторожны при выполнении операции вставки в таблицу. Проследите за тем, чтобы соответствующие данные были помещены в нужную колонку. Тщательно проверьте вашу последовательность операторов T-SQL, прежде чем использовать ее для доступа к любым важным данным или их модификации.
Александр Тарасян
Александр Тарасян
Армения, Ереван, Ереванский Политехнический институт, 1974