ALTER TABLE – SQL (Comando)

Modifica la estructura de una tabla por programa.

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

–O bien–

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

–O bien–

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

Parámetros

  • TableName1
    Especifica el nombre de la tabla cuya estructura se desea modificar.

  • ADD [COLUMN] FieldName1
    Especifica el nombre del campo que se desea agregar. Una única tabla puede contener hasta 255 campos. Si uno o más de los campos permiten valores nulos, el límite se reduce en uno, a 254 campos.

  • ALTER [COLUMN] FieldName1
    Especifica el nombre de un campo existente que se desea modificar.

  • FieldType [(nFieldWidth [, nPrecision])]
    Especifica el tipo de campo, el ancho del campo y la precisión (número de posiciones decimales) de un campo nuevo o modificado.

    FieldType es una sola letra que indica el tipo de datos del campo. Para algunos tipos de datos de campos es obligatorio especificar nFieldWidth o nPrecision, o ambos.

    La siguiente tabla indica los valores para FieldType, y si nFieldWidth y nPrecision son obligatorios:

    FieldType nFieldWidth nPrecision Descripción
    C N Campo Character de ancho n
    D Fecha
    T DateTime
    N N D Campo Numeric de ancho n con d posiciones decimales
    F N D Campo Numeric flotante de ancho n con d posiciones decimales
    I Integer
    B D Double
    Y Currency
    L Lógicas
    M Memo
    G General
    P Imagen

    nFieldWidth y nPrecision se pasan por alto para los tipos D, T, I, Y, L, M, G y P. nPrecision toma el valor predeterminado de cero (sin decimales) si no se incluye nPrecision para los tipos N, F o B.

  • NULL | NOT NULL
    Admite o excluye valores nulos en el campo. Si uno o más campos pueden contener valores NULL, el número máximo de campos que la tabla puede contener se reduce en una unidad, de 255 a 254.

    Si omite NULL y NOT NULL, la configuración actual de SET NULL determinará si se admiten valores nulos en el campo. No obstante, si omite NULL y NOT NULL, e incluye la cláusula PRIMARY KEY o UNIQUE, se pasará por alto la configuración actual de SET NULL y el campo tomará el valor predeterminado NOT NULL.

  • CHECK lExpression1
    Especifica una regla de validación para el campo. lExpression1 debe evaluarse como una expresión lógica y puede ser una función definida por el usuario o un procedimiento almacenado. Cuando se anexa un registro en blanco se comprueba la regla de validación. Se generará un error si la regla de validación no permite un valor de campo en blanco en un registro anexado.

  • ERROR cMessageText1
    Especifica el mensaje de error mostrado cuando la regla de validación de campo genera un error. El mensaje solamente se muestra cuando se modifican los datos desde una ventana Examinar o Modificar.

  • DEFAULT eExpression1
    Especifica un valor predeterminado para el campo. El tipo de datos de eExpression1 debe ser igual que el tipo de datos del campo.

  • PRIMARY KEY
    Crea una etiqueta de índice principal. La etiqueta de índice tiene el mismo nombre que el campo.

  • UNIQUE
    Crea una etiqueta de índice candidato con el mismo nombre que el campo.

    Si desea más información acerca de los índices candidatos, vea Trabajar con tablas.

    Nota   Los índices candidatos (que se crean al incluir la opción UNIQUE, proporcionada para facilitar la compatibilidad con ANSI en ALTER TABLE o CREATE TABLE) no son iguales que los índices creados con la opción UNIQUE en el comando INDEX. Un índice creado con UNIQUE en el comando INDEX permite claves de índice duplicadas, mientras que los índices candidatos no las admiten.

    Los valores nulos y los registros duplicados no se permiten en un campo utilizado para un índice principal o candidato.

    Durante la creación de un campo nuevo con ADD COLUMN, Microsoft Visual FoxPro no generará ningún error si crea un índice principal o candidato para un campo que admite valores nulos. No obstante, Visual FoxPro generará un error si intenta escribir un valor nulo o duplicado en un campo que ya se ha utilizado para un índice principal o candidato.

    Si desea modificar un campo existente y la expresión de índice principal o candidato consta únicamente del nombre de un campo existente, Visual FoxPro comprueba el campo para ver si contiene valores nulos o registros duplicados. En caso afirmativo, Visual FoxPro genera un error y la tabla no se modifica.

  • REFERENCES TableName2 TAG TagName1
    Especifica la tabla primaria con la cual se establece una relación permanente. TAG TagName1 especifica la etiqueta de índice de la tabla primaria en que se basa la relación. Los nombres de etiqueta de índice pueden contener hasta 10 caracteres.

  • NOCPTRANS
    Impide la conversión a otra página de códigos distinta para los campos de tipo carácter y memo. Si la tabla se convierte a otra página de códigos, los campos para los que se haya especificado NOCPTRANS no se convertirán. NOCPTRANS solamente se puede especificar para los campos de tipo carácter y memo.

    El ejemplo siguiente crea una tabla denominada MYTABLE con dos campos de caracteres y dos campos memo. El segundo campo de caracteres char2 y el segundo campo memo memo2 incluyen NOCPTRANS para evitar la conversión.

    CREATE TABLE mytable (char1 C(10), char2 C(10) NOCPTRANS,;
       memo1 M, memo2 M NOCPTRANS)
    
  • ALTER [COLUMN] FieldName2
    Especifica el nombre de un campo existente que se desea modificar. Observe que no se necesitan múltiples cláusulas ALTER COLUMN para modificar más de una propiedad de un campo en un único comando ALTER TABLE. Vea los ejemplos de ALTER TABLE para saber cómo se estructuran las cláusulas ALTER COLUMN.

  • SET DEFAULT eExpression2
    Especifica un nuevo valor predeterminado para un campo existente. El tipo de datos de eExpression2 debe ser el mismo definido para el campo.

  • SET CHECK lExpression2
    Especifica una nueva regla de validación para un campo existente. lExpression2 debe evaluarse como una expresión lógica; puede tratarse de una función definida por el usuario o un procedimiento almacenado.

  • ERROR cMessageText2
    Especifica el mensaje de error mostrado cuando la regla de validación de campo genera un error. El mensaje solamente se muestra cuando se modifican los datos desde una ventana Examinar o Modificar.

  • DROP DEFAULT
    Elimina el valor predeterminado para un campo existente.

  • DROP CHECK
    Elimina la regla de validación para un campo existente.

  • DROP [COLUMN] FieldName3
    Especifica un campo que se desea eliminar de la tabla. Al eliminar un campo de la tabla también se elimina la configuración del valor predeterminado del campo y la regla de validación de campo.

    Si hay referencias al campo en expresiones de desencadenador o de clave de índice, estas expresiones dejarán de ser válidas cuando se elimine el campo. En este caso no se genera ningún error al eliminar el campo, pero las expresiones no válidas de clave de índice o de desencadenador generarán errores en tiempo de ejecución.

  • SET CHECK lExpression3
    Especifica la regla de validación de tabla. lExpression3 debe evaluarse como una expresión lógica y debe ser una función definida por el usuario o un procedimiento almacenado.

  • ERROR cMessageText3
    Especifica el mensaje de error que se muestra cuando la regla de validación de tabla genera un error. El mensaje solamente se muestra cuando se modifican los datos desde una ventana Examinar o Modificar.

  • DROP CHECK
    Elimina la regla de validación de la tabla.

  • ADD PRIMARY KEY eExpression3 [FOR lExpression4] TAG TagName2
    Agrega un índice principal a la tabla. eExpression3 especifica la expresión de clave del índice principal y TagName2 especifica el nombre de la etiqueta de índice principal. Los nombres de etiqueta de índice pueden contener hasta 10 caracteres. Si TAG TagName2 se omite y eExpression3 es un solo campo, la etiqueta de índice principal tendrá el mismo nombre que el campo especificado en eExpression3.

    Incluya FOR lExpression4 para especificar una condición mediante la cual sólo se puede ver y tener acceso a los registros que cumplan la expresión de filtro lExpression4; las claves de índice principales se crean precisamente para los registros que cumplen la expresión de filtro. Observe que debe evitar utilizar la cláusula FOR para crear un índice primario; la unicidad de una clave primaria es forzosa sólo para los registros que cumplan la condición especificada con FOR lExpression4. En su lugar, utilice el comando INDEX con una cláusula FOR para crear un índice filtrado.

    Rushmore optimiza un comando ALTER TABLE ... FOR lExpression4 si lExpression4 es una expresión optimizable. Para obtener el máximo rendimiento, utilice una expresión optimizable en la cláusula FOR.

    Si desea obtener más información, vea SET OPTIMIZE y Usar Rushmore para agilizar el acceso a los datos.

  • DROP PRIMARY KEY
    Elimina el índice principal y su etiqueta de índice. Puesto que una tabla solamente puede tener una clave principal, no es necesario especificar el nombre de esta clave. Al eliminar el índice principal también se eliminan todas las relaciones persistentes basadas en la clave principal.

  • ADD UNIQUE eExpression4 [TAG TagName3 [FOR lExpression5]]
    Agrega un índice candidato a la tabla. eExpression4 especifica la expresión clave del índice candidato y TagName3 especifica el nombre de la etiqueta de índice candidato. Los nombres de etiqueta de índice pueden contener hasta 10 caracteres. Si omite TAG TagName3 y eExpression4 es un solo campo, la etiqueta de índice candidato tendrá el mismo nombre que el campo especificado en eExpression4.

    Incluya FOR lExpression5 para especificar una condición mediante la cual sólo se puede ver y tener acceso a los registros que cumplan la expresión de filtro lExpression5; las claves de índice candidato se crean en el archivo de índices precisamente para los registros que cumplen la expresión de filtro.

    Rushmore optimiza un comando ALTER TABLE ... FOR lExpression5 si lExpression5 es una expresión optimizable. Para obtener el máximo rendimiento, utilice una expresión optimizable en la cláusula FOR.

    Si desea obtener más información, vea SET OPTIMIZE y Usar Rushmore para agilizar el acceso a los datos.

  • DROP UNIQUE TAG TagName4
    Elimina el índice candidato y su etiqueta de índice. Puesto que una tabla puede tener múltiples claves de candidato, es necesario especificar el nombre de la etiqueta de índice candidato.

  • ADD FOREIGN KEY [eExpression5] TAG TagName4 [FOR lExpression6]
    Agrega un índice externo (no principal) a la tabla. eExpression5 especifica la expresión clave del índice externo y TagName4 especifica el nombre de la etiqueta de índice externo. Los nombres de etiqueta de índice pueden contener hasta 10 caracteres.

    Incluya FOR lExpression6 para especificar una condición mediante la cual sólo se puede ver y tener acceso a los registros que cumplan la expresión de filtro lExpression6; las claves de índice externas se crean en el archivo de índices precisamente para los registros que cumplan la expresión de filtro.

    Rushmore optimiza un comando ALTER TABLE ... FOR lExpression6 si lExpression6 es una expresión optimizable. Para obtener el máximo rendimiento, utilice una expresión optimizable en la cláusula FOR.

    Si desea obtener más información, vea SET OPTIMIZE y Usar Rushmore para agilizar el acceso a los datos.

  • REFERENCES TableName2 [TAG TagName5]
    Especifica la tabla primaria con la cual se establece una relación permanente. Incluya TAG TagName5 para establecer una relación basada en una etiqueta de índice existente para la tabla primaria. Los nombres de etiqueta de índice pueden contener hasta 10 caracteres. Si omite TAG TagName5, la relación se establece mediante la etiqueta de índice principal de la tabla primaria.

  • DROP FOREIGN KEY TAG TagName6 [SAVE]
    Elimina una clave externa cuya etiqueta de índice es TagName6. Si omite SAVE, la etiqueta de índice se elimina del índice estructural. Incluya SAVE para evitar que se elimine la etiqueta del índice estructural.

  • RENAME COLUMN FieldName4 TO FieldName5
    Permite cambiar el nombre de un campo de la tabla. FieldName4 especifica el nombre del campo cuyo nombre se cambia. FieldName5 especifica el nombre nuevo para este campo.

    Precaución   Tenga cuidado al cambiar el nombre de los campos de la tabla; es posible que las expresiones de índice, las reglas de validación de campos y tablas, los comandos, las funciones, etc. hagan referencia a los nombres originales de los campos.

  • NOVALIDATE
    Especifica que Visual FoxPro permite realizar modificaciones en la estructura de la tabla que pueden alterar la integridad de los datos incluidos en dicha tabla. De forma predeterminada, Visual FoxPro impide que ALTER TABLE modifique la estructura de la tabla con cambios que alteran la integridad de sus datos. Incluya NOVALIDATE para anular este comportamiento predeterminado.

Observaciones

ALTER TABLE se puede utilizar para modificar la estructura de una tabla que no se ha agregado a ninguna base de datos. Sin embargo, Visual FoxPro genera un error si incluye las cláusulas DEFAULT, FOREIGN KEY, PRIMARY KEY, REFERENCES o SET al modificar una tabla libre.

ALTER TABLE puede volver a generar la tabla al crear un nuevo encabezado de tabla y anexar registros en este encabezado. Por ejemplo, modificar el tipo o el ancho de un campo pueden causar que se vuelva a generar una tabla.

Cuando se vuelve a generar una tabla, las reglas de validación de campo se ejecutan para cualquier campo cuyo tipo o ancho se haya modificado. Si cambia el tipo o el ancho de algún campo de la tabla, se ejecuta la regla de la tabla.

Si modifica las reglas de validación de campo o tabla para una tabla con registros, Visual FoxPro comprobará las nuevas reglas de validación del campo o la tabla con los datos existentes y presentará una advertencia la primera vez que se produzca una infracción de una regla de validación de campo o tabla, o una infracción de un desencadenador.

Es posible que ALTER TABLE no produzca resultados coherentes cuando se utilice con cursores de Visual FoxPro creados con el comando CREATE CURSOR. En particular, puede crear un cursor de Visual FoxPro con características (nombres de campo largos, por ejemplo) que habitualmente sólo estarían disponibles con tablas que formen parte de un contenedor de base de datos. Dado que ALTER TABLE guarda una copia temporal del cursor, se aplican las reglas aplicables a tablas libres; cualquier característica que requiera soporte de base de datos se pierde o se modifica de forma impredecible. Por lo tanto, como regla general, es recomendable evitar el uso de ALTER TABLE con cursores de Visual FoxPro a menos que se hayan comprobado y comprendido los resultados.

Ejemplo

El ejemplo 1 agrega un campo denominado fax a la tabla customer y permite que el campo incluya valores nulos.

El ejemplo 2 transforma el campo cust_id en la clave principal de la tabla customer.

El ejemplo 3 agrega una regla de validación al campo quantity de la tabla orders de forma que los valores del campo quantity no pueden ser negativos.

El ejemplo 4 agrega una relación persistente de uno a varios entre las tablas customer y orders basada en la clave principal cust_id de la tabla customer, y un nuevo índice de clave exterior cust_id en la tabla orders.

El ejemplo 5 elimina la regla de validación del campo quantity de la tabla orders.

El ejemplo 6 elimina la relación persistente entre las tablas customer y orders, pero conserva la etiqueta de índice cust_id en la tabla orders.

El ejemplo 7 agrega un campo llamado fax2 a la tabla customer e impide que el campo contenga valores nulos. Se muestra la nueva estructura de la tabla. Se usan dos cláusulas ALTER COLUMN para permitir que el campo tenga valores nulos y establecer el valor predeterminado para el campo como el valor nulo. Observe que no se necesitan múltiples cláusulas ALTER COLUMN para modificar más de una propiedad de un campo en un único comando ALTER TABLE. El nuevo campo se elimina de la tabla para restablecer la tabla a su estado original.

* Example 1
SET PATH TO (HOME(2) + '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

* Example 7
CLEAR
ALTER TABLE customer ADD COLUMN fax2 c(20) NOT NULL
DISPLAY STRUCTURE

ALTER TABLE customer;
   ALTER COLUMN fax2 NULL;
   ALTER COLUMN fax2 SET DEFAULT .NULL.

ALTER TABLE customer DROP COLUMN fax2

Vea también

CREATE TABLE - SQL | INDEX | MODIFY STRUCTURE | OPEN DATABASE | SET OPTIMIZE | Usar Rushmore para agilizar el acceso a los datos