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

Управление таблицами с помощью T-SQL и Enterprise Manager

Изменение типа данных

Чтобы можно было изменить тип данных какой-либо колонки, для исходного типа данных должно существовать неявное преобразование в новый тип данных. Таблицу допустимых преобразований можно найти под заголовком "CAST and CONVERT (T-SQL)" (Приведение и преобразование [T-SQL]) в Books Online. Для доступа к этой теме найдите "CAST" в Books Online и затем выберите в диалоговом окне Topics Found "CAST and CONVERT (T-SQL)".

Оператор изменения типа данных колонки имеет следующий синтаксис:

ALTER TABLE		<имя_таблицы>
ALTER COLUMN	<имя_колонки> 	<новый_тип_данных>

Если вы измените для таблицы Bicycle_Sales тип данных datetime колонки sale_date на тип smalldatetime, то строки данных будут занимать меньше места.

Дело в том, что datetime занимает 8 байтов, а smalldatetime – только 4. Чтобы выполнить это изменение, используйте следующий оператор:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN	sale_date smalldatetime 	NOT NULL 
GO

Любые существующие данные таблицы будут неявно преобразованы в новый тип данных – smalldatetime. Null -атрибут NOT NULL не изменился.

Чтобы изменить тип данных char(30) колонки description на тип varchar(20) (имеющий меньшую длину), используйте следующий оператор:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN		description varchar(20) 	NULL
GO

Отметим, что исходный тип данных char(30) допускает неявное преобразование в новый тип данных varchar(20), но varchar(20) короче. Поэтому для всех существующих строк будет без оповещения выполнено усечение значений колонки description длиной более 20 символов и преобразование в тип varchar(20).

Примечание. Если вы изменяете тип данных колонки на новый тип данных, имеющий меньшую длину, то для всех существующих строк таблицы, у которых значение этой колонки превышает по длине новый тип данных, будет автоматически выполнено усечение соответствующих значений.
Изменение null-атрибута

Чтобы изменить null -атрибут, вы можете изменить для колонки атрибут NOT NULL на NULL, за исключением колонок с ограничением primary key. (По определению в таких колонках не допускаются null -значения.) Вы можете изменить атрибут NULL на NOT NULL, только если в строках соответствующей колонки нет null -значений. Если колонка содержит null -значения, то вы можете выполнить оператор UPDATE для замены всех null -значений на некоторое фактическое значение и затем изменить NULL на NOT NULL для этой колонки. Если null -атрибут не указан для измененной колонки, то в этой колонке допускаются null -значения по умолчанию. Рассмотрим некоторые примеры.

Для изменения null -атрибута колонки quantity с тем, чтобы допускались null -значения, выполните следующий оператор:

ALTER TABLE		Bicycle_Sales 
ALTER COLUMN	quantity tinyint 	NULL 
GO

Тип данных колонки, tinyint, остался без изменений; изменился только null -атрибут. Теперь в колонке quantity будут допускаться null -значения. Если не введено никакого значения, будет происходить автоматическая вставка значения NULL. Это изменение не влияет на значения колонки quantity в существующих строках, но оно позволяет вставлять NULL -значения для новых строк, добавляемых к таблице.

Теперь изменим описание колонки description на NOT NULL. Мы предположим, что в этой колонке уже имеются null -значения. Поэтому сначала мы должны заменить эти null -значения на какое-то фактическое значение – в данном случае – на значение None (Нет), совместимое с типом данной колонки. Чтобы выполнить проверку на значение NULL, надежнее всего не использовать оператор равенства (=), а применять ключевые слова IS NULL или IS NOT NULL. Дело в том, что NULL означает неизвестное значение, а оператор равенства, возможно, не может выполнять сравнение для null -значений (это зависит от установки параметра базы данных ANSI nulls ON [активизирован] или OFF [отключен]). Если для этого параметра задано значение OFF, то оператор равенства выражение = NULL возвратит значение TRUE, если выражение содержит null -значение. Этот оператор возвратит значение FALSE, если выражение не содержит null -значения. Если для параметра ANSI nulls задано значение ON, то оператор выражение = NULL возвратит для всех сравнений значение UNKNOWN и не будет выдано никаких результатов. SQL Server не возвращает значений NULL, как можно было бы ожидать, если параметр ANSI nulls установлен в значение ON. IS NULL и IS NOT NULL действуют одинаковым образом независимо от установки параметра ANSI_NULLS. Чтобы заменить null -значения колонки description на значение None, используйте следующий оператор UPDATE SET:

UPDATE				Bicycle_Sales SET description = "None"
WHERE				description IS NULL 
GO

Теперь изменим null -атрибут колонки description на NOT NULL:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN	description char(30) 	NOT NULL 
GO

И в данном случае мы изменили только null -атрибут этой колонки, а исходный тип данных char(30) остался без изменений. Вы можете одновременно изменить тип данных и null -атрибут в одном операторе ALTER TABLE, как это показано ниже:

ALTER TABLE		Bicycle_Sales
ALTER COLUMN	description varchar(20) 	NOT NULL 
GO

Этот оператор изменяет тип данных и null -атрибут колонки description.