Команда ALTER TABLE - SQL

Заданным образом модифицирует структуру таблицы.

Синтаксис:

ALTER TABLE TableName1
	ADD | ALTER [COLUMN] FieldName1
		FieldType [(nFieldWidth [, nPrecision])]
		[NULL | NOT NULL]
		[CHECK lExpression1 [ERROR cMessageText1]]
		[DEFAULT eExpression1]
		[PRIMARY KEY | UNIQUE]
		[REFERENCES TableName2 [TAG TagName1]]
		[NOCPTRANS]

- Или -

ALTER TABLE TableName1
	ALTER [COLUMN] FieldName2
		[NULL | NOT NULL]
		[SET DEFAULT eExpression2]
		[SET CHECK lExpression2 [ERROR cMessageText2]]
		[DROP DEFAULT]
		[DROP CHECK]

- Или -

ALTER TABLE TableName1
	[DROP [COLUMN] FieldName3]
	[SET CHECK lExpression3 [ERROR cMessageText3]]
	[DROP CHECK]
	[ADD PRIMARY KEY eExpression3 TAG TagName2]
	[DROP PRIMARY KEY]
	[ADD UNIQUE eExpression4 [TAG TagName3]]
	[DROP UNIQUE TAG TagName4]
	[ADD FOREIGN KEY [eExpression5] TAG TagName4
		REFERENCES TableName2 [TAG TagName5]]
	[DROP FOREIGN KEY TAG TagName6 [SAVE]]
	[RENAME COLUMN FieldName4 TO FieldName5]
	[NOVALIDATE]

Параметры:
TableName1
Задает имя таблицы, структура которой модифицируется.
ADD [COLUMN] FieldName1
Задает имя добавляемого поля.
ALTER [COLUMN] FieldName1
Задает имя существующего поля, подлежащего модификации.
FieldType [(nFieldWidth [, nPrecision]])
Задает тип поля, ширину поля и точность поля (число десятичных знаков) для нового или модифицируемого поля.
FieldType это одна буква, указывающая тип данных поля. Для некоторых типов полей требуется задавать nFieldWidth и/или nPrecision.
В следующей таблице перечислены значения параметра FieldType; для каждого из них указывается, требуются ли параметры nFieldWidth и nPrecision.

FieldType	nFieldWidth 	nPrecision	Описание
C		n		-		Символьное поле ширины n
D		-		-		Дата
T		-		-		Поле типа DateTime
N		n		d		Числовое поле ширины n, имеющее d десятичных знаков
F		n		d		Поле данных с плавающей запятой ширины n, имеющее d десятичных знаков
I		-		-		Поле целых чисел
B		-		d		Поле данных с двойной точностью
Y		-		-		Поле типа Currency
L		-		-		Логическое
M		-		-		Поле типа Memo
G		-		-		Поле типа General

Параметры nFieldWidth и nPrecision игнорируются в случае типов D, T, I, Y, L, M, G и P. Если для типа N, F или B значение nPrecision не указано, оно принимается равным нулю по умолчанию (нет десятичных знаков).
NULL
Разрешает полю принимать значения NULL.
NOT NULL
Запрещает полю принимать значения NULL.
Если опущены предложения NULL и NOT NULL, то допустимость значений NULL для поля определяется текущей установкой SET NULL. Однако если опустить предложения NULL и NOT NULL и задать PRIMARY KEY или UNIQUE, текущая установка SET NULL будет игнорироваться и по умолчанию для поля будет установлено NOT NULL.
CHECK lExpression1
Задает правило проверки достоверности уровня поля. Вычисление lExpression1 должно давать логическое выражение; это может быть функция, определенная пользователем, или хранимая процедура. Учтите, что это правило проверяется при добавлении пустой записи. Если данное правило не допускает пустые значения полей в присоединяемой записи, генерируется ошибка.
ERROR cMessageText1
Задает текст сообщения об ошибке, отображаемого при обнаружении ошибки в соответствии с правилом поля. Это сообщение выдается только при изменении данных в окне просмотра или окне редактирования.
DEFAULT eExpression1
Задает для поля значение, принимаемое по умолчанию. Тип данных выражения eExpression1 должен совпадать с типом данных поля.
PRIMARY KEY
Создает тег первичного индекса. Имя тега совпадает с именем поля.
UNIQUE
Создает тег индекса-кандидата с тем же именем, которое носит поле. Подробнее об индексах-кандидатах см. главу 7 "Работа с таблицами" Руководства разработчика.
Замечание Индексы-кандидаты (созданные с помощью опции UNIQUE, включенной в команды ALTER TABLE и CREATE TABLE для совместимости с ANSI) отличаются от индексов, созданных с помощью опции UNIQUE команды INDEX. Индекс, созданный опцией UNIQUE в команде INDEX, допускает дублирование ключей индекса; в индексах-кандидатах повторяющиеся ключи не разрешены.
В поле, используемом для первичного индекса или индекса-кандидата, не допускаются значения NULL и повторяющиеся записи.
Если вы создаете новое поле с помощью предложения ADD COLUMN, то при создании первичного индекса или индекса-кандидата для поля, поддерживающего значения NULL, Visual FoxPro не будет генерировать ошибку. Однако если вы попытаетесь ввести значение NULL или дубликат в поле, используемое для первичного индекса или индекса-кандидадата, Visual FoxPro выдаст ошибку.
Если вы модифицируете существующее поле, а выражение первичного индекса или индекса-кандидата состоит только из имени одного этого поля, Visual FoxPro проверит поле не содержит ли оно значений NULL или повторяющихся записей. Если такие значения будут обнаружены, Visual FoxPro сгенерирует ошибку и таблица остается без изменений. Если выражение индекса содержит несколько полей или выражение, включающее одиночное поле, Visual FoxPro не будет проверять наличие значений NULL или дублирующих записей.
REFERENCES TableName2 TAG TagName1
Задает родительскую таблицу, с которой устанавливается постоянное отношение. TAG TagName1 задает тег индекса родительской таблицы, на котором базируется данное отношение. Имя тега индекса может содержать не более 10 символов.
NOCPTRANS
Запрещает для символьных и memo-полей трансляцию в другую кодовую страницу. Если таблица преобразуется в другую кодовую таблицу, поля с опцией NOCPTRANS не участвуют в трансляции. NOCPTRANS можно задать только для символьных полей и memo-полей.
В следующем примере создается таблица с именем MYTABLE, которая содержит два символьных поля и два memo-поля. Второе символьное поле char2 и второе memo-поле memo2 определены с опцией NOCPTRANS для предотвращения трансляции.

CREATE TABLE mytable (char1 C(10), char2 C(10) NOCPTRANS,;
	memo1 M, memo2, M NOCPTRANS)

ALTER [COLUMN] FieldName2
Задает имя существующего поля, которое предстоит модифицировать.
SET DEFAULT eExpression2
Задает новое значение, которое будет приниматься по умолчанию для существующего поля. Тип данных выражения eExpression2 должен совпадать с типом данных, определенным для поля.
SET CHECK lExpression2
Задает новое правило для существующего поля. Вычисление lExpression2 должно давать логическое значение; это может быть определенная пользователем функция или хранимая процедура.
ERROR cMessageText2
Задает текст сообщения об ошибке. Это сообщение будет отображаться при обнаружении ошибки в соответствии с правилом уровня поля. Сообщение выдается только в том случае, когда происходит изменение данных в окне просмотра или окне редактирования.
DROP DEFAULT
Отменяет значение, принимаемое по умолчанию для существующего поля.
DROP CHECK
Отменяет правило для существующего поля.
DROP [COLUMN] FieldName3
Задает поле, которое нужно удалить из таблицы. При удалении поля из таблицы также отменяется значение, принимаемое по умолчанию для этого поля.
Если для поля указывает выражение ключа индекса или выражение триггера, то после удаления поля эти выражения становятся недействительными. В таком случае при удалении поля не будет генерироваться ошибка, однако ошибки возникнут для недействительных выражений ключа индекса или триггера на этапе выполнения.
SET CHECK lExpression3
Задает правило уровня таблицы. Вычисление lExpression3 должно давать логическое выражение, это может быть определенная пользователем функция или хранимая процедура.
ERROR cMessageText3
Задает текст сообщения об ошибке, отображаемого при обнаружении ошибки в соответствии с правилом уровня таблицы. Это сообщение выдается только при изменении данных в окне просмотра или окне редактирования.
DROP CHECK
Отменяет правило уровня таблицы.
ADD PRIMARY KEY eExpression3 TAG TagName2
Добавляет в таблицу первичный индекс. eExpression3 задает выражение ключа первичного индекса, а TagName2 имя тега первичного индекса. Имя тега индекса может содержать не более 10 символов. Если TAG TagName2 опущено, а eExpression3 определяет одно поле, тег первичного индекса получает то же имя, что и поле, заданное в выражении eExpression3.
DROP PRIMARY KEY
Удаляет первичный индекс и его тег. Поскольку таблица может иметь только один первичный ключ, его имя можно не указывать. При удалении первичного индекса удаляются и все постоянные отношения, основанные на первичном ключе.
ADD UNIQUE eExpression4 [TAG TagName3]
Добавляет в таблицу индекс-кандидат. eExpression4 задает выражение ключа индекса-кандидата, а TagName3 имя тега индекса-кандидата. Имя тега индекса может содержать не более 10 символов. Если выражение TAG TagName3 опущено, а eExpression4 определяет одно поле, тег индекса-кандидата получает то же имя, что и поле, заданное в выражении eExpression4.
DROP UNIQUE TAG TagName4
Удаляет индекс-кандидат и его тег. Поскольку таблица может иметь несколько ключей-кандидатов, необходимо задать имя удаляемого тега индекса-кандидата.
ADD FOREIGN KEY [eExpression5] TAG TagName4
Добавляет в таблицу внешний (отличный от первичного) индекс. eExpression5 задает выражение ключа внешнего индекса, а TagName4 имя тега внешнего индекса. Имя тега индекса может содержать не более 10 символов.
REFERENCES TableName2 [TAG TagName5]
Задает родительскую таблицу, с которой устанавливается постоянное отношение. Чтобы установить отношение с родительской таблицей на базе тега существующего индекса, следует указать TAG TagName5. Имя тега индекса может содержать не более 10 символов. Если TAG TagName5 опущено, отношение устанавливается с помощью тега первичного индекса родительской таблицы.
DROP FOREIGN KEY TAG TagName6 [SAVE]
Удаляет внешний ключ, у которого тег индекса имеет имя TagName6. Если опустить SAVE, тег индекса будет удален из структурного индекса. Включив SAVE, вы предотвратите удаление тега из структурного индекса.
RENAME COLUMN FieldName4 TO FieldName5
Позволяет изменять имя поля в таблице. FieldName4 задает имя поля, которое следует изменить. FieldName5 задает новое имя поля.
Внимание Будьте осторожны при переименовании полей таблиц выражения индекса, правила проверки достоверности полей и таблиц, команды, функции и т.п. могут продолжать ссылаться на старые имена полей.
NOVALIDATE
Указывает, что Visual FoxPro допускает внесение изменений в структуру таблицы, которые могут нарушить целостность табличных данных. По умолчанию Visual FoxPro запрещает команде ALTER TABLE вносить в структуру подобные разрушающие изменения. Включение опции NOVALIDATE позволяет снять этот запрет.

Комментарии
С помощью команды ALTER TABLE можно модифицировать структуру таблицы, не включенной в базу данных. Однако если при модификации свободной таблицы используются предложения DEFAULT, FOREIGN KEY, PRIMARY KEY, REFERENCES или SET, Visual FoxPro сгенерирует ошибку.
Команда ALTER TABLE может перестроить таблицу, создав новый заголовок таблицы и добавив к нему записи. Например, таблица может быть перестроена в результате изменения типа или ширины поля.
После того как таблица перестроена, для всех полей, тип или ширина которых подверглись изменению, выполняются правила полей. Если вы изменили тип или ширину какого-либо поля в таблице, выполняется правило таблицы.
Если вы модифицировали правила полей или таблицы в таблице, имеющей записи, Visual FoxPro проведет тестирование новых правил на существующих данных и выдаст предупреждение при первом нарушении правила или триггера.
Если модифицируемая таблица принадлежит базе данных, то для работы команды ALTER TABLE - SQL необходимо, чтобы эта база данных была открыта для монопольного пользования. Чтобы открыть базу данных для монопольного пользования, включите предложение EXCLUSIVE в команду OPEN DATABASE.

Примеры:

* Пример 1 добавляет поле fax в таблицу customer, причем в поле
* разрешены значения NULL.
* Пример 2 определяет поле cust_id в качестве первичного ключа 
* таблицы customer.
* Пример 3 добавляет в поле quantity таблицы orders правило, 
* требующее, чтобы значения этого поля были неотрицательными.
* Пример 4 добавляет постоянное отношение один-ко-многим между 
* таблицами customer и orders, основанное на первичном ключе 
* cust_id в таблице customer и новом внешнем ключе cust_id 
* в таблице orders.
* Пример 5 удаляет правило из поля quantity в таблице orders.
* Пример 6 удаляет постоянное отношение между таблицами customer и 
* orders, сохраняя тег индекса cust_id в таблице orders.
* Example 1
SET PATH TO (HOME( ) + 'samples\data\')	&& Sets path to table
ALTER TABLE customer ADD COLUMN fax c(20) NULL

* Example 2
ALTER TABLE customer ADD PRIMARY KEY cust_id TAG cust_id

ALTER TABLE customer ALTER COLUMN cust_id c(5) PRIMARY KEY

* Example 3
ALTER TABLE orders;
	 ALTER COLUMN quantity SET CHECK quantity >= 0;
	 ERROR "Quantities must be non-negative"

* Example 4
ALTER TABLE orders;
	ADD FOREIGN KEY cust_id TAG cust_id REFERENCES customer

* Example 5
ALTER TABLE orders ALTER COLUMN quantity DROP CHECK

* Example 6
ALTER TABLE orders DROP FOREIGN KEY TAG cust_id SAVE

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.