В лекции 10 вы узнали, как создавать таблицу путем определения ее колонок и типов данных. Создав таблицу, вы можете модифицировать ее различными способами, даже если эта таблица уже содержит данные. В данной лекции описываются некоторые способы модифицирования таблиц, включая изменение, добавление, удаление и переименование колонок, а также удаление всей таблицы. (О создании и модифицировании ограничений ( constraints (*) ) таблицы (метод обеспечения целостности данных), а также триггерах (специальный тип хранимой процедуры, которая автоматически запускается при определенных условиях) см. лекции 16 и 22.)
constraint – это "связывающее" ограничение, но мы будем называть его для краткости просто ограничением. – Прим пер.В данной лекции мы рассмотрим использование Transact-SQL (T-SQL) и Microsoft SQL Server 2000 Enterprise Manager для управления вашими таблицами. Следует помнить, что T-SQL и Enterprise Manager имеют различные уровни гибкости для модифицирования таблицы. Enterprise Manager более полезен в том смысле, что позволяет вам выполнять определенные модификации проще, чем при использовании T-SQL. Enterprise Manager выводит на экран информативные сообщения об ошибках и иногда предлагает альтернативы, если вы пытаетесь выполнить неверную модификацию. Однако T-SQL имеет одно преимущество, состоящее в том, что если вы запускаете команды с записью сценария, то получаете записанную трассировку того, как и в каком порядке выполнялись ваши модификации. В этой лекции мы рассмотрим преимущества и недостатки использования этих двух методов для модифицирования таблиц.
Прежде чем начать изучение, нам нужно создать две таблицы в базе данных MyDB – Bicycle_Sales (Продажи велосипедов) и Bicycle_Inventory (Запасы велосипедов), – которые будут использоваться для примеров этой лекции. Таблица Bicycle_Sales содержит информацию по продажам велосипедов и состоит из следующих колонок: make_id (идентификатор изделия), model_id (идентификатор модели), description (описание), year (год), sale_id (идентификатор продажи), price (цена), (внешний ключ). Это ограничение содержит ссылку на колонки make_id и model_id в таблице Bicycle_Inventory, образуя уникальный может содержать ссылку только на колонку первичного ключа (primary key) или другую колонку с уникальным ограничением в ссылочной таблице. (Подробное описание ограничений дается в лекции 16, описание индексов – в лекции 17.)
Колонка sale_id объявлена как CREATE TABLE для создания каждой из этих таблиц:
USE MyDB
GO
CREATE TABLE Bicycle_Inventory
(
make_name char(10) NOT NULL,
make_id tinyint NOT NULL,
model_name char(12) NOT NULL,
model_id tinyint NOT NULL,
in_stock tinyint NOT NULL,
on_order tinyint NULL,
CONSTRAINT MI_clu_indx
UNIQUE CLUSTERED(make_id, model_id)
)
GO
CREATE TABLE Bicycle_Sales
(
make_id tinyint NOT NULL,--Использована в ограничении
--foreign key
model_id tinyint NOT NULL,--Также использована в ограничении
--foreign key
description char(30) NULL,
year char(4) NOT NULL,
sale_id int NOT NULL IDENTITY (1,1) PRIMARY KEY CLUSTERED,
price smallmoney NOT NULL,
quantity tinyint NOT NULL,
sale_date datetime NOT NULL,
CONSTRAINT sales_inventory_fk FOREIGN KEY (make_id, model_id)
REFERENCES Bicycle_Inventory(make_id, model_id)
)
GO
Теперь, создав наши примеры таблиц базы данных, внесем некоторые изменения, используя сначала T-SQL и затем – Enterprise Manager.
В этом разделе вы узнаете, как использовать операторы T-SQL для изменения, добавления, удаления и переименования колонок в существующей таблице. Для осуществления всех модификаций таблицы используется оператор T-SQL .
Создав таблицу, вы можете изменить для колонки тип данных, точность (для числовых типов) и null-атрибут, а также добавить к колонке свойство ROWGUIDCOL или удалить его из колонки, и все это с помощью оператора . Используя другие операторы T-SQL, вы можете выполнять и другие модификации колонок, такие как добавление значения по умолчанию. (Подробно об этих операторах см. лекцию 16.)
Не все колонки можно изменять. В общем случае вы не можете изменять следующие типы колонок.
primary key или foreign key.text, ntext, image или timestamp .ROWGUIDCOL (вы можете, однако, добавлять к колонке свойство ROWGUIDCOL или удалять его).check или unique. ( Об ограничениях см. лекцию 16.)CREATE STATISTICS (формируемые с помощью SQL Server данные статистики удаляются с помощью оператора ALTER TABLE ).Все другие типы колонок можно изменять с помощью оператора . В некоторых из предыдущих случаев вы можете снять запрет на изменение колонки. Например, вы можете удалить ограничение или какое-либо другое ограничение или удалить индекс по колонке, и если к данной колонке не относятся какие-либо другие запреты, то можете затем изменять эту колонку.
Чтобы можно было изменить тип данных какой-либо колонки, для исходного типа данных должно существовать
Оператор изменения типа данных колонки имеет следующий синтаксис:
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 -атрибут, вы можете изменить для колонки атрибут NOT NULL на NULL, за исключением колонок с ограничением primary key. (По определению в таких колонках не допускаются null -значения.) Вы можете изменить атрибут NULL на NOT NULL, только если в строках соответствующей колонки нет null -значений. Если колонка содержит null -значения, то вы можете выполнить оператор UPDATE для замены всех null -значений на некоторое фактическое значение и затем изменить NULL на NOT NULL для этой колонки. Если null -атрибут не указан для измененной колонки, то в этой колонке допускаются null -значения по умолчанию. Рассмотрим некоторые примеры.
Для изменения null -атрибута колонки null -значения, выполните следующий оператор:
ALTER TABLE Bicycle_Sales ALTER COLUMN quantity tinyint NULL GO
Тип данных колонки, tinyint, остался без изменений; изменился только null -атрибут. Теперь в колонке будут допускаться null -значения. Если не введено никакого значения, будет происходить автоматическая вставка значения NULL. Это изменение не влияет на значения колонки 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 Bicycle_Sales ALTER COLUMN description varchar(20) NOT NULL GO
Этот оператор изменяет тип данных и null -атрибут колонки description.
Чтобы добавить к колонке или удалить из колонки свойство ROWGUIDCOL, используйте следующий синтаксис:
ALTER TABLE <имя_таблицы> ALTER COLUMN <имя_колонки> ADD | DROP ROWGUIDCOL
Свойство ROWGUIDCOL можно добавлять только в колонку типа uniqueidentifier. Если предположить, что в нашу таблицу Bicycle_Sales была включена колонка типа uniqueidentifier с именем unique_id, то вы могли бы добавить свойство ROWGUIDCOL с помощью следующего оператора:
ALTER TABLE Bicycle_Sales ALTER COLUMN unique_id ADD ROWGUIDCOL GO
И вы могли бы удалить это свойство с помощью следующего оператора:
ALTER TABLE Bicycle_Sales ALTER COLUMN unique_id DROP ROWGUIDCOL GO
С помощью оператора вы можете также добавлять колонки к таблице. Определение колонок происходит почти одинаково – будь то создание или
Добавляя колонку с атрибутом NOT NULL, вы должны также объявить значение по умолчанию, чтобы это значение появилось в новой колонке уже существующих строк. Это значение по умолчанию задается с помощью ключевого слова DEFAULT. Чтобы добавить колонку, используйте следующий синтаксис:
ALTER TABLE <имя_таблицы> ADD <имя_колонки> <тип_данных> <null-атрибут> DEFAULT значение_по_умолчанию
Например, чтобы добавить к таблице Bicycle_Sales колонку с именем salesperson_id (идентификатор продавца), используйте следующий оператор. (В новой колонке не допускаются null -значения, и она имеет значение по умолчанию, равное 0.)
ALTER TABLE Bicycle_Sales ADD salesperson_id tinyint NOT NULL DEFAULT 0 GO
Поскольку колонка объявлена как NOT NULL, то во всех существующих строках таблицы в новую колонку будет занесено значение 0.
Если вместо этого колонка salesperson_id будет объявлена как NULL (см. ниже), то значение по умолчанию не будет обязательным:
ALTER TABLE Bicycle_Sales ADD salesperson_id tinyint NULL DEFAULT 0 --Необязательное значение по умолчанию GO
Несмотря на то, что мы задали значение по умолчанию, в колонку salesperson_id существующих строк будет занесено значение NULL, а значение по умолчанию будет присваиваться только в новых строках.
Чтобы в существующих строках вместо значения NULL также было присвоено значение по умолчанию (0), используйте в ключевом слове DEFAULT опцию WITH VALUES, как это показано ниже:
ALTER TABLE Bicycle_Sales ADD salesperson_id tinyint NULL DEFAULT 0 WITH VALUES GO
Опция WITH VALUES указывает, что во всех существующих строках новой колонке будет присвоено вместо значения NULL значение по умолчанию.
Вы можете также использовать оператор для удаления колонок из таблицы. Все данные удаленной колонки будут удалены из таблицы. При использовании T-SQL для удаления колонок вы не можете удалять следующие типы колонок.
primary key, foreign key, unique или check.Для удаления колонки из таблицы используйте следующий синтаксис:
ALTER TABLE <имя_таблицы> DROP COLUMN <имя_колонки>
Следующий оператор удаляет колонку description из таблицы Bicycle_Sales:
ALTER TABLE Bicycle_Sales DROP COLUMN description GO
Колонка description и все ее значения удаляются изо всех строк таблицы.
Чтобы переименовать колонку с помощью операторов T-SQL, вы должны запустить системную хранимую процедуру sp_rename, используя следующий синтаксис:
sp_rename 'таблица.исходное_имя_колонки', 'новое_имя_колонки', 'COLUMN'
Например, чтобы заменить имя колонки description на Bicycle_desc, вам нужно использовать следующий оператор:
sp_rename 'Bicycle_Sales.description', 'bicycle_desc', 'COLUMN' GO
Исходное имя колонки должно быть задано в формате таблица.колонка, но имя таблицы не следует включать в имя новой колонки.
Как уже говорилось, модифицирование таблицы с помощью Enterprise Manager выполняется проще и дает вам больше функциональных возможностей и гибкости, чем операторы T-SQL. Вы можете выполнять все свои модификации в окне Design Table (Проектирование таблицы) или с помощью схемы (диаграммы) базы данных. Рассмотрим сначала использование окна Design Table. Чтобы открыть окно Design Table для вашей таблицы Bicycle_Sales, выполните следующие шаги:
Чтобы изменить колонку в окне Design Table, просто щелкните на соответствующей ячейке или установите нужный флажок в "сетке" и внесите необходимые изменения. Каждая строка в этой сетке представляет колонку таблицы. Заголовки вверху сетки указывают, какое свойство задает каждая ячейка сетки.
Для некоторых ситуаций, когда T-SQL не позволяет выполнить определенные модификации и возвращает сообщение об ошибке, Enterprise Manager предоставляет дополнительные возможности, позволяющие вам правильно осуществить процесс модификаций. Например, если вы попытаетесь с помощью оператора T-SQL изменить длину данных колонки, имеющей ограничение primary key или , то получите сообщение об ошибке, аналогичное следующему сообщению:
Column or parameter #0: Cannot specify a column width on data type int. (Колонка или параметр #0: Невозможно задать ширину колонки по типу данных int.)
Но если вы используете Enterprise Manager, то увидите окно сообщения, в котором можно изменить длину данных для этой колонки.
Например, чтобы изменить тип данных tinyint на тип для колонки make_id (имеющей ограничение , содержащее ссылку на колонку make_id таблицы Bicycle_Inventory), просто щелкните на tinyint, щелкните на направленной вниз стрелке, чтобы появился раскрывающийся список (рис. 15.3).
(рис 15.3) Изменение типа данных колонки с помощью Enterprise ManagerПоскольку колонка make_id имеет ограничение , появится диалоговое окно tinyint в .
(рис 15.4) Диалоговое окно Data Type Change Required (Требуется изменение типа данных)Как и в случае использования T-SQL, при изменении типа данных с помощью Enterprise Manager исходный тип данных должен допускать datetime в тип text. Щелкните на кнопке OK, чтобы закрыть окно с сообщением об ошибке, и измените недопустимый тип данных на тип, допускающий
(рис 15.5) Сообщение об ошибке, которое выводится после попытки изменения типа данных на тип, не допускающий неявного преобразованияЧтобы сохранить ваши изменения, щелкните на кнопке Save Disk (Сохранение на диске) панели инструментов окна Design Table. Затем в диалоговом окне Save (Сохранение) (рис. 15.6), нужно подтвердить, что указанные таблицы должны быть записаны на диск. Чтобы подтвердить, что вы хотите сохранить ваши изменения, щелкните на кнопке Yes.
(рис 15.6) Диалоговое окно Save (Сохранить)
Чтобы добавить колонку, щелкните на столбце Column Name (Имя колонки) первой пустой строки окна Design Table, введите имя новой колонки, выберите тип ее данных и присвойте ей нужные атрибуты ( Allow Nulls [Разрешить null -значения], Default Value [Значение по умолчанию], Identity и т.д.). Как показано на рис. 15.7, мы добавили колонку с именем salesperson_id с типом данных tinyint, с разрешением использования null -значений и значением по умолчанию 0. Щелкните на кнопке Save Disk, чтобы сохранить ваши изменения. SQL Server добавит к таблице эту новую колонку
(рис 15.7) Добавление новой колонки с именем salesperson_id
Удаление колонки – это простой процесс, если вы работаете с Enterprise Manager. В окне Design Table нужно просто щелкнуть правой кнопкой мыши на имени колонки или любом из ее атрибутов (на любой ячейке строки с именем данной колонки) и выбрать из контекстного меню пункт Delete Column (Удалить колонку). Соответствующая строка будет удалена из таблицы. Не забудьте щелкнуть на кнопке Save Disk, чтобы сохранить ваши изменения.
Enterprise Manager предупредит вас, если вы попытаетесь удалить колонку, которая является частью ограничения или индекса, если колонка содержит значение по умолчанию или имеет связанное с ней правило. Вы увидите окно сообщения (рис. 15.8). После щелчка на кнопке Yes последует удаление данной колонки вместе со всеми ее связями.
(рис 15.8) Окно сообщения, которое появляется при попытке удаления колонки, имеющей связи с другими колонками и таблицами
Вы можете также модифицировать таблицы в Enterprise Manager с помощью схемы базы данных. Чтобы создать схему для базы данных MyDB с двумя таблицами Bicycle_Sales и Bicycle_Inventory, выполните следующие шаги:

(рис 15.10) Начальное окно мастера Create Database Diagram Wizard (Создание схемы базы данных)(рис 15.9) Окно Select Tables to be Added (Выбор таблиц для добавления)Вертикальная линия, которая заканчивается изображением ключа и соединяет две таблицы в вашей схеме, представляет связь между ними, выраженную ограничением . Чтобы вывести на экран метку этой связи, щелкните правой кнопкой мыши на фоновой части окна и выберите из контекстного меню пункт Show Relationship Labels (Показать метки связей). Появится имя ограничения (рис. 15.12).
Чтобы выделить какую-либо таблицу, щелкните на ней; чтобы выделить более одной таблицы, щелкните на каждой таблице, удерживая клавишу Ctrl. Если щелкнуть правой кнопкой мыши на одной из таблиц и затем выбрать из контекстного меню какой-либо пункт, то соответствующая операция будет применена ко всем выделенным таблицам. Например, если выделить в вашей схеме баз данных обе таблицы, щелкнуть правой кнопкой мыши на одной из таблиц и затем выбрать из контекстного меню пункт Table View, затем Standard, то вид обеих таблиц будет изменен, чтобы представить на экране свойства всех колонок (рис. 15.13).

(рис 15.12) Пример схемы базы данных(рис 15.11) Просмотр меток связей между таблицами
(рис 15.13) Просмотр свойств по колонкам в схеме базы данныхПредставление свойств колонок на экране для каждой таблицы аналогично окну Design Table, и каждую таблицу можно модифицировать с помощью тех же методов, что и в окне Design Table. Просто добавьте или измените данные колонок в нужных ячейках и сохраните ваши изменения, щелкнув на кнопке Save Disk. Вы можете также перемещать таблицы и изменять их размеры в схеме базы данных, выводить на экран различные представления таблиц и выполнять другие действия. Опробуйте различные команды контекстного меню. Отметим, что как только вы вносите какое-либо изменение в таблицу, рядом с именем этой таблицы появляется символ "звездочка", указывающий, что внесены изменения.
Если вы изменили таблицу, то любые необходимые изменения вносятся в существующие строки данных сразу после исполнения оператора T-SQL или после сохранения изменений, если вы используете Enterprise Manager. SQL Server налагает блокировку на данную таблицу, чтобы никакие другие пользователи не имели к ней доступа, пока выполняются изменения. Модифицирование, которое требует изменения всех строк в достаточно большой таблице, такое как добавление колонки со свойством NOT NULL и значением по умолчанию или удаление колонки, может занять некоторое время и должно выполняться с осторожностью в периоды минимального пользовательского доступа. Если вы модифицируете колонку путем изменения длины ее данных, точности или масштаба, то соответствующая таблица повторно создается в базе данных и существующие данные преобразуются в новый тип данных.
Все
Если вы удаляете таблицу, то удаляется все, что связано с этой таблицей: определения и данные таблицы, индексы, ограничения, триггеры и полномочия доступа. Представления и хранимые процедуры, содержащие ссылки на удаляемую таблицу, должны быть удалены явным образом. Таблицу нельзя удалить, если на нее есть ссылка с помощью ограничения в другой таблице; иными словами, таблицу нельзя удалить, если от нее зависит другая таблица. Прежде чем удалить данную таблицу, следует сначала удалить это ограничение или ссылающуюся таблицу. С другой стороны, таблицу, содержащую ограничение , можно удалить, если от нее не зависит никакая другая таблица. В этом разделе мы рассмотрим удаление таблицы с помощью T-SQL и Enterprise Manager.
Оператор T-SQL, используемый для
DROP TABLE <имя_таблицы>
Для удаления представлений или хранимых процедур, которые ссылаются на удаляемую таблицу, используйте оператор DROP VIEW или DROP PROCEDURE. Вы можете удалять представления и хранимые процедуры до или после удаления этой таблицы. После
Для , мы должны сначала удалить это ограничение (с именем sales_inventory_fk ) и затем удалить таблицу, как это показано ниже:
ALTER TABLE Bicycle_Sales DROP CONSTRAINT sales_inventory_fk GO DROP TABLE Bicycle_Inventory GO
Если вы попытаетесь удалить таблицу до удаления ограничения , то получите сообщение об ошибке и таблица не будет удалена.
В Enterprise Manager имеется два метода
(рис 15.15) Диалоговое окно Dependencies для таблицы Bicycle_SalesЧтобы удалить таблицу, которая имеет зависимые таблицы, мы будем использовать второй метод: схему базы данных. В этом примере мы удалим таблицу Bicycle_Inventory, на которую имеется ссылка с помощью ограничения в таблице Bicycle_Sales. Это удаление не удалось бы выполнить, если бы мы использовали диалоговое окно Drop Objects. Но, используя схему базы данных, где показаны обе таблицы, мы можем удалить любую таблицу, а ограничение будет удалено автоматически. Для
foreign key будут удалены из схемы.В этой лекции вы узнали, как использовать T-SQL и Enterprise Manager для модифицирования таблиц базы данных путем изменения, удаления, добавления и переименования колонок. В процессе изложения материала были показаны некоторые отличия между функциональными возможностями T-SQL и Enterprise Manager. Вы также узнали, как создается схема базы данных с помощью мастера
В лекции 10 вы узнали, как создавать таблицу путем определения ее колонок и типов данных. Создав таблицу, вы можете модифицировать ее различными способами, даже если эта таблица уже содержит данные. В данной лекции описываются некоторые способы модифицирования таблиц, включая изменение, добавление, удаление и переименование колонок, а также удаление всей таблицы. (О создании и модифицировании ограничений ( constraints (*) ) таблицы (метод обеспечения целостности данных), а также триггерах (специальный тип хранимой процедуры, которая автоматически запускается при определенных условиях) см. лекции 16 и 22.)
constraint – это "связывающее" ограничение, но мы будем называть его для краткости просто ограничением. – Прим пер.В данной лекции мы рассмотрим использование Transact-SQL (T-SQL) и Microsoft SQL Server 2000 Enterprise Manager для управления вашими таблицами. Следует помнить, что T-SQL и Enterprise Manager имеют различные уровни гибкости для модифицирования таблицы. Enterprise Manager более полезен в том смысле, что позволяет вам выполнять определенные модификации проще, чем при использовании T-SQL. Enterprise Manager выводит на экран информативные сообщения об ошибках и иногда предлагает альтернативы, если вы пытаетесь выполнить неверную модификацию. Однако T-SQL имеет одно преимущество, состоящее в том, что если вы запускаете команды с записью сценария, то получаете записанную трассировку того, как и в каком порядке выполнялись ваши модификации. В этой лекции мы рассмотрим преимущества и недостатки использования этих двух методов для модифицирования таблиц.
Прежде чем начать изучение, нам нужно создать две таблицы в базе данных MyDB – Bicycle_Sales (Продажи велосипедов) и Bicycle_Inventory (Запасы велосипедов), – которые будут использоваться для примеров этой лекции. Таблица Bicycle_Sales содержит информацию по продажам велосипедов и состоит из следующих колонок: make_id (идентификатор изделия), model_id (идентификатор модели), description (описание), year (год), sale_id (идентификатор продажи), price (цена), (внешний ключ). Это ограничение содержит ссылку на колонки make_id и model_id в таблице Bicycle_Inventory, образуя уникальный может содержать ссылку только на колонку первичного ключа (primary key) или другую колонку с уникальным ограничением в ссылочной таблице. (Подробное описание ограничений дается в лекции 16, описание индексов – в лекции 17.)
Колонка sale_id объявлена как CREATE TABLE для создания каждой из этих таблиц:
USE MyDB
GO
CREATE TABLE Bicycle_Inventory
(
make_name char(10) NOT NULL,
make_id tinyint NOT NULL,
model_name char(12) NOT NULL,
model_id tinyint NOT NULL,
in_stock tinyint NOT NULL,
on_order tinyint NULL,
CONSTRAINT MI_clu_indx
UNIQUE CLUSTERED(make_id, model_id)
)
GO
CREATE TABLE Bicycle_Sales
(
make_id tinyint NOT NULL,--Использована в ограничении
--foreign key
model_id tinyint NOT NULL,--Также использована в ограничении
--foreign key
description char(30) NULL,
year char(4) NOT NULL,
sale_id int NOT NULL IDENTITY (1,1) PRIMARY KEY CLUSTERED,
price smallmoney NOT NULL,
quantity tinyint NOT NULL,
sale_date datetime NOT NULL,
CONSTRAINT sales_inventory_fk FOREIGN KEY (make_id, model_id)
REFERENCES Bicycle_Inventory(make_id, model_id)
)
GO
Теперь, создав наши примеры таблиц базы данных, внесем некоторые изменения, используя сначала T-SQL и затем – Enterprise Manager.
В этом разделе вы узнаете, как использовать операторы T-SQL для изменения, добавления, удаления и переименования колонок в существующей таблице. Для осуществления всех модификаций таблицы используется оператор T-SQL .
Создав таблицу, вы можете изменить для колонки тип данных, точность (для числовых типов) и null-атрибут, а также добавить к колонке свойство ROWGUIDCOL или удалить его из колонки, и все это с помощью оператора . Используя другие операторы T-SQL, вы можете выполнять и другие модификации колонок, такие как добавление значения по умолчанию. (Подробно об этих операторах см. лекцию 16.)
Не все колонки можно изменять. В общем случае вы не можете изменять следующие типы колонок.
primary key или foreign key.text, ntext, image или timestamp .ROWGUIDCOL (вы можете, однако, добавлять к колонке свойство ROWGUIDCOL или удалять его).check или unique. ( Об ограничениях см. лекцию 16.)CREATE STATISTICS (формируемые с помощью SQL Server данные статистики удаляются с помощью оператора ALTER TABLE ).Все другие типы колонок можно изменять с помощью оператора . В некоторых из предыдущих случаев вы можете снять запрет на изменение колонки. Например, вы можете удалить ограничение или какое-либо другое ограничение или удалить индекс по колонке, и если к данной колонке не относятся какие-либо другие запреты, то можете затем изменять эту колонку.
Чтобы можно было изменить тип данных какой-либо колонки, для исходного типа данных должно существовать
Оператор изменения типа данных колонки имеет следующий синтаксис:
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 -атрибут, вы можете изменить для колонки атрибут NOT NULL на NULL, за исключением колонок с ограничением primary key. (По определению в таких колонках не допускаются null -значения.) Вы можете изменить атрибут NULL на NOT NULL, только если в строках соответствующей колонки нет null -значений. Если колонка содержит null -значения, то вы можете выполнить оператор UPDATE для замены всех null -значений на некоторое фактическое значение и затем изменить NULL на NOT NULL для этой колонки. Если null -атрибут не указан для измененной колонки, то в этой колонке допускаются null -значения по умолчанию. Рассмотрим некоторые примеры.
Для изменения null -атрибута колонки null -значения, выполните следующий оператор:
ALTER TABLE Bicycle_Sales ALTER COLUMN quantity tinyint NULL GO
Тип данных колонки, tinyint, остался без изменений; изменился только null -атрибут. Теперь в колонке будут допускаться null -значения. Если не введено никакого значения, будет происходить автоматическая вставка значения NULL. Это изменение не влияет на значения колонки 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 Bicycle_Sales ALTER COLUMN description varchar(20) NOT NULL GO
Этот оператор изменяет тип данных и null -атрибут колонки description.
Чтобы добавить к колонке или удалить из колонки свойство ROWGUIDCOL, используйте следующий синтаксис:
ALTER TABLE <имя_таблицы> ALTER COLUMN <имя_колонки> ADD | DROP ROWGUIDCOL
Свойство ROWGUIDCOL можно добавлять только в колонку типа uniqueidentifier. Если предположить, что в нашу таблицу Bicycle_Sales была включена колонка типа uniqueidentifier с именем unique_id, то вы могли бы добавить свойство ROWGUIDCOL с помощью следующего оператора:
ALTER TABLE Bicycle_Sales ALTER COLUMN unique_id ADD ROWGUIDCOL GO
И вы могли бы удалить это свойство с помощью следующего оператора:
ALTER TABLE Bicycle_Sales ALTER COLUMN unique_id DROP ROWGUIDCOL GO
С помощью оператора вы можете также добавлять колонки к таблице. Определение колонок происходит почти одинаково – будь то создание или
Добавляя колонку с атрибутом NOT NULL, вы должны также объявить значение по умолчанию, чтобы это значение появилось в новой колонке уже существующих строк. Это значение по умолчанию задается с помощью ключевого слова DEFAULT. Чтобы добавить колонку, используйте следующий синтаксис:
ALTER TABLE <имя_таблицы> ADD <имя_колонки> <тип_данных> <null-атрибут> DEFAULT значение_по_умолчанию
Например, чтобы добавить к таблице Bicycle_Sales колонку с именем salesperson_id (идентификатор продавца), используйте следующий оператор. (В новой колонке не допускаются null -значения, и она имеет значение по умолчанию, равное 0.)
ALTER TABLE Bicycle_Sales ADD salesperson_id tinyint NOT NULL DEFAULT 0 GO
Поскольку колонка объявлена как NOT NULL, то во всех существующих строках таблицы в новую колонку будет занесено значение 0.
Если вместо этого колонка salesperson_id будет объявлена как NULL (см. ниже), то значение по умолчанию не будет обязательным:
ALTER TABLE Bicycle_Sales ADD salesperson_id tinyint NULL DEFAULT 0 --Необязательное значение по умолчанию GO
Несмотря на то, что мы задали значение по умолчанию, в колонку salesperson_id существующих строк будет занесено значение NULL, а значение по умолчанию будет присваиваться только в новых строках.
Чтобы в существующих строках вместо значения NULL также было присвоено значение по умолчанию (0), используйте в ключевом слове DEFAULT опцию WITH VALUES, как это показано ниже:
ALTER TABLE Bicycle_Sales ADD salesperson_id tinyint NULL DEFAULT 0 WITH VALUES GO
Опция WITH VALUES указывает, что во всех существующих строках новой колонке будет присвоено вместо значения NULL значение по умолчанию.
Вы можете также использовать оператор для удаления колонок из таблицы. Все данные удаленной колонки будут удалены из таблицы. При использовании T-SQL для удаления колонок вы не можете удалять следующие типы колонок.
primary key, foreign key, unique или check.Для удаления колонки из таблицы используйте следующий синтаксис:
ALTER TABLE <имя_таблицы> DROP COLUMN <имя_колонки>
Следующий оператор удаляет колонку description из таблицы Bicycle_Sales:
ALTER TABLE Bicycle_Sales DROP COLUMN description GO
Колонка description и все ее значения удаляются изо всех строк таблицы.
Чтобы переименовать колонку с помощью операторов T-SQL, вы должны запустить системную хранимую процедуру sp_rename, используя следующий синтаксис:
sp_rename 'таблица.исходное_имя_колонки', 'новое_имя_колонки', 'COLUMN'
Например, чтобы заменить имя колонки description на Bicycle_desc, вам нужно использовать следующий оператор:
sp_rename 'Bicycle_Sales.description', 'bicycle_desc', 'COLUMN' GO
Исходное имя колонки должно быть задано в формате таблица.колонка, но имя таблицы не следует включать в имя новой колонки.
Как уже говорилось, модифицирование таблицы с помощью Enterprise Manager выполняется проще и дает вам больше функциональных возможностей и гибкости, чем операторы T-SQL. Вы можете выполнять все свои модификации в окне Design Table (Проектирование таблицы) или с помощью схемы (диаграммы) базы данных. Рассмотрим сначала использование окна Design Table. Чтобы открыть окно Design Table для вашей таблицы Bicycle_Sales, выполните следующие шаги:
Чтобы изменить колонку в окне Design Table, просто щелкните на соответствующей ячейке или установите нужный флажок в "сетке" и внесите необходимые изменения. Каждая строка в этой сетке представляет колонку таблицы. Заголовки вверху сетки указывают, какое свойство задает каждая ячейка сетки.
Для некоторых ситуаций, когда T-SQL не позволяет выполнить определенные модификации и возвращает сообщение об ошибке, Enterprise Manager предоставляет дополнительные возможности, позволяющие вам правильно осуществить процесс модификаций. Например, если вы попытаетесь с помощью оператора T-SQL изменить длину данных колонки, имеющей ограничение primary key или , то получите сообщение об ошибке, аналогичное следующему сообщению:
Column or parameter #0: Cannot specify a column width on data type int. (Колонка или параметр #0: Невозможно задать ширину колонки по типу данных int.)
Но если вы используете Enterprise Manager, то увидите окно сообщения, в котором можно изменить длину данных для этой колонки.
Например, чтобы изменить тип данных tinyint на тип для колонки make_id (имеющей ограничение , содержащее ссылку на колонку make_id таблицы Bicycle_Inventory), просто щелкните на tinyint, щелкните на направленной вниз стрелке, чтобы появился раскрывающийся список (рис. 15.3).
(рис 15.3) Изменение типа данных колонки с помощью Enterprise ManagerПоскольку колонка make_id имеет ограничение , появится диалоговое окно tinyint в .
(рис 15.4) Диалоговое окно Data Type Change Required (Требуется изменение типа данных)Как и в случае использования T-SQL, при изменении типа данных с помощью Enterprise Manager исходный тип данных должен допускать datetime в тип text. Щелкните на кнопке OK, чтобы закрыть окно с сообщением об ошибке, и измените недопустимый тип данных на тип, допускающий
(рис 15.5) Сообщение об ошибке, которое выводится после попытки изменения типа данных на тип, не допускающий неявного преобразованияЧтобы сохранить ваши изменения, щелкните на кнопке Save Disk (Сохранение на диске) панели инструментов окна Design Table. Затем в диалоговом окне Save (Сохранение) (рис. 15.6), нужно подтвердить, что указанные таблицы должны быть записаны на диск. Чтобы подтвердить, что вы хотите сохранить ваши изменения, щелкните на кнопке Yes.
(рис 15.6) Диалоговое окно Save (Сохранить)
Чтобы добавить колонку, щелкните на столбце Column Name (Имя колонки) первой пустой строки окна Design Table, введите имя новой колонки, выберите тип ее данных и присвойте ей нужные атрибуты ( Allow Nulls [Разрешить null -значения], Default Value [Значение по умолчанию], Identity и т.д.). Как показано на рис. 15.7, мы добавили колонку с именем salesperson_id с типом данных tinyint, с разрешением использования null -значений и значением по умолчанию 0. Щелкните на кнопке Save Disk, чтобы сохранить ваши изменения. SQL Server добавит к таблице эту новую колонку
(рис 15.7) Добавление новой колонки с именем salesperson_id
Удаление колонки – это простой процесс, если вы работаете с Enterprise Manager. В окне Design Table нужно просто щелкнуть правой кнопкой мыши на имени колонки или любом из ее атрибутов (на любой ячейке строки с именем данной колонки) и выбрать из контекстного меню пункт Delete Column (Удалить колонку). Соответствующая строка будет удалена из таблицы. Не забудьте щелкнуть на кнопке Save Disk, чтобы сохранить ваши изменения.
Enterprise Manager предупредит вас, если вы попытаетесь удалить колонку, которая является частью ограничения или индекса, если колонка содержит значение по умолчанию или имеет связанное с ней правило. Вы увидите окно сообщения (рис. 15.8). После щелчка на кнопке Yes последует удаление данной колонки вместе со всеми ее связями.
(рис 15.8) Окно сообщения, которое появляется при попытке удаления колонки, имеющей связи с другими колонками и таблицами
Вы можете также модифицировать таблицы в Enterprise Manager с помощью схемы базы данных. Чтобы создать схему для базы данных MyDB с двумя таблицами Bicycle_Sales и Bicycle_Inventory, выполните следующие шаги:

(рис 15.10) Начальное окно мастера Create Database Diagram Wizard (Создание схемы базы данных)(рис 15.9) Окно Select Tables to be Added (Выбор таблиц для добавления)Вертикальная линия, которая заканчивается изображением ключа и соединяет две таблицы в вашей схеме, представляет связь между ними, выраженную ограничением . Чтобы вывести на экран метку этой связи, щелкните правой кнопкой мыши на фоновой части окна и выберите из контекстного меню пункт Show Relationship Labels (Показать метки связей). Появится имя ограничения (рис. 15.12).
Чтобы выделить какую-либо таблицу, щелкните на ней; чтобы выделить более одной таблицы, щелкните на каждой таблице, удерживая клавишу Ctrl. Если щелкнуть правой кнопкой мыши на одной из таблиц и затем выбрать из контекстного меню какой-либо пункт, то соответствующая операция будет применена ко всем выделенным таблицам. Например, если выделить в вашей схеме баз данных обе таблицы, щелкнуть правой кнопкой мыши на одной из таблиц и затем выбрать из контекстного меню пункт Table View, затем Standard, то вид обеих таблиц будет изменен, чтобы представить на экране свойства всех колонок (рис. 15.13).

(рис 15.12) Пример схемы базы данных(рис 15.11) Просмотр меток связей между таблицами
(рис 15.13) Просмотр свойств по колонкам в схеме базы данныхПредставление свойств колонок на экране для каждой таблицы аналогично окну Design Table, и каждую таблицу можно модифицировать с помощью тех же методов, что и в окне Design Table. Просто добавьте или измените данные колонок в нужных ячейках и сохраните ваши изменения, щелкнув на кнопке Save Disk. Вы можете также перемещать таблицы и изменять их размеры в схеме базы данных, выводить на экран различные представления таблиц и выполнять другие действия. Опробуйте различные команды контекстного меню. Отметим, что как только вы вносите какое-либо изменение в таблицу, рядом с именем этой таблицы появляется символ "звездочка", указывающий, что внесены изменения.
Если вы изменили таблицу, то любые необходимые изменения вносятся в существующие строки данных сразу после исполнения оператора T-SQL или после сохранения изменений, если вы используете Enterprise Manager. SQL Server налагает блокировку на данную таблицу, чтобы никакие другие пользователи не имели к ней доступа, пока выполняются изменения. Модифицирование, которое требует изменения всех строк в достаточно большой таблице, такое как добавление колонки со свойством NOT NULL и значением по умолчанию или удаление колонки, может занять некоторое время и должно выполняться с осторожностью в периоды минимального пользовательского доступа. Если вы модифицируете колонку путем изменения длины ее данных, точности или масштаба, то соответствующая таблица повторно создается в базе данных и существующие данные преобразуются в новый тип данных.
Все
Если вы удаляете таблицу, то удаляется все, что связано с этой таблицей: определения и данные таблицы, индексы, ограничения, триггеры и полномочия доступа. Представления и хранимые процедуры, содержащие ссылки на удаляемую таблицу, должны быть удалены явным образом. Таблицу нельзя удалить, если на нее есть ссылка с помощью ограничения в другой таблице; иными словами, таблицу нельзя удалить, если от нее зависит другая таблица. Прежде чем удалить данную таблицу, следует сначала удалить это ограничение или ссылающуюся таблицу. С другой стороны, таблицу, содержащую ограничение , можно удалить, если от нее не зависит никакая другая таблица. В этом разделе мы рассмотрим удаление таблицы с помощью T-SQL и Enterprise Manager.
Оператор T-SQL, используемый для
DROP TABLE <имя_таблицы>
Для удаления представлений или хранимых процедур, которые ссылаются на удаляемую таблицу, используйте оператор DROP VIEW или DROP PROCEDURE. Вы можете удалять представления и хранимые процедуры до или после удаления этой таблицы. После
Для , мы должны сначала удалить это ограничение (с именем sales_inventory_fk ) и затем удалить таблицу, как это показано ниже:
ALTER TABLE Bicycle_Sales DROP CONSTRAINT sales_inventory_fk GO DROP TABLE Bicycle_Inventory GO
Если вы попытаетесь удалить таблицу до удаления ограничения , то получите сообщение об ошибке и таблица не будет удалена.
В Enterprise Manager имеется два метода
(рис 15.15) Диалоговое окно Dependencies для таблицы Bicycle_SalesЧтобы удалить таблицу, которая имеет зависимые таблицы, мы будем использовать второй метод: схему базы данных. В этом примере мы удалим таблицу Bicycle_Inventory, на которую имеется ссылка с помощью ограничения в таблице Bicycle_Sales. Это удаление не удалось бы выполнить, если бы мы использовали диалоговое окно Drop Objects. Но, используя схему базы данных, где показаны обе таблицы, мы можем удалить любую таблицу, а ограничение будет удалено автоматически. Для
foreign key будут удалены из схемы.В этой лекции вы узнали, как использовать T-SQL и Enterprise Manager для модифицирования таблиц базы данных путем изменения, удаления, добавления и переименования колонок. В процессе изложения материала были показаны некоторые отличия между функциональными возможностями T-SQL и Enterprise Manager. Вы также узнали, как создается схема базы данных с помощью мастера
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.