Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989 |
Лекция 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" .) В большинстве случае вы не можете вручную помещать значения данных в эти два типа колонок.
