ALTER TABLE (Transact-SQL)

Actualizado: 15 de septiembre de 2007

Modifica una definición de tabla al alterar, agregar o quitar columnas y restricciones, al reasignar particiones o al deshabilitar o habilitar restricciones y desencadenadores.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

ALTER TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name 
{ 
    ALTER COLUMN column_name 
    { 
        [ type_schema_name. ] type_name [ ( { precision [ , scale ] 
            | max | xml_schema_collection } ) ] 
        [ COLLATE collation_name ] 
        [ NULL | NOT NULL ] 
    | {ADD | DROP } { ROWGUIDCOL | PERSISTED | NOT FOR REPLICATION}
    } 
    | [ WITH { CHECK | NOCHECK } ] ADD 
    { 
        <column_definition>
      | <computed_column_definition>
      | <table_constraint> 
    } [ ,...n ]
    | DROP 
    { 
        [ CONSTRAINT ] constraint_name 
        [ WITH ( <drop_clustered_constraint_option> [ ,...n ] ) ]
        | COLUMN column_name 
    } [ ,...n ] 
    | [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT 
        { ALL | constraint_name [ ,...n ] } 
    | { ENABLE | DISABLE } TRIGGER 
        { ALL | trigger_name [ ,...n ] }
    | SWITCH [ PARTITION source_partition_number_expression ]
        TO target_table 
        [ PARTITION target_partition_number_expression ]
}
[ ; ]

<drop_clustered_constraint_option> ::=  
    { 
        MAXDOP = max_degree_of_parallelism
      | ONLINE = {ON | OFF }
      | MOVE TO { partition_scheme_name ( column_name ) | filegroup
          | "default"}
    }

Argumentos

  • database_name
    Es el nombre de la base de datos en la que se creó la tabla.
  • schema_name
    Es el nombre del esquema al que pertenece la tabla.
  • table_name
    Es el nombre de la tabla que se va a modificar. Si la tabla no se encuentra en la base de datos actual o no está contenida en el esquema propiedad del usuario actual, la base de datos y el esquema deben especificarse explícitamente.
  • ALTER COLUMN
    Especifica que la columna con nombre va a cambiarse o modificarse. ALTER COLUMN no está permitido si el nivel de compatibilidad es 65 o más bajo. Para obtener más información, vea sp_dbcmptlevel (Transact-SQL).

    La columna modificada no puede ser ninguna de las siguientes:

    • Ser una columna con un tipo de datos timestamp.
    • Ser la columna ROWGUIDCOL de la tabla.
    • Ser una columna calculada ni utilizarse en una columna calculada.
    • Utilizarse en un índice, a menos que la columna sea un tipo de datos varchar, nvarchar o varbinary, el tipo de datos no se cambie, el nuevo tamaño sea igual o mayor al tamaño anterior, y que el índice no sea el resultado de una restricción PRIMARY KEY.
    • Utilizarse en las estadísticas generadas por la instrucción CREATE STATISTICS. Quite primero las estadísticas con la instrucción DROP STATISTICS. Las estadísticas generadas automáticamente por el optimizador de consultas se quitan automáticamente con ALTER COLUMN.
    • Utilizarse en una restricción PRIMARY KEY o [FOREIGN KEY] REFERENCES.
    • Utilizarse en una restricción CHECK o UNIQUE. Sin embargo, se permite el cambio de longitud de una columna de longitud variable en una restricción CHECK o UNIQUE.
    • Asociarse a la definición predeterminada. No obstante, la longitud, precisión o escala de una columna puede cambiarse si el tipo de datos no se cambia.
      El tipo de datos de las columnas text, ntext e image puede cambiarse de las formas siguientes:
      • text por varchar(max), nvarchar(max) o xml
      • ntext por varchar(max), nvarchar(max) o xml
      • image por varbinary(max)
        Algunos cambios del tipo de datos podrían suponer un cambio en los datos. Por ejemplo, cambiar una columna nchar o nvarchar por una columna char o varchar puede suponer la conversión de caracteres extendidos. Para obtener más información, vea CAST y CONVERT (Transact-SQL). Reducir la precisión o escala de una columna puede dar como resultado que se trunquen los datos.
        El tipo de datos de una columna de una tabla con particiones no puede cambiarse.
  • column_name
    Es el nombre de la columna que se va a alterar, agregar o quitar. column_name puede tener un máximo de 128 caracteres. Si se trata de nuevas columnas, column_name se puede omitir en las columnas creadas con un tipo de datos timestamp. Si no se especifica column_name en una columna de tipo de datos timestamp, se utiliza el nombre timestamp.
  • [ type_schema_name**.** ] type_name
    Es el nuevo tipo de datos de la columna alterada o el tipo de datos de la columna agregada. type_name no se puede especificar para las columnas existentes de tablas con particiones. type_name puede ser cualquiera de los siguientes:

    • Un tipo de datos del sistema de SQL Server 2005.
    • Un tipo de datos del alias basado en el tipo de datos del sistema de SQL Server. Los tipos de datos de alias se crean con la instrucción CREATE TYPE antes de que puedan utilizarse en una definición de tabla.
    • Un tipo definido por el usuario de .NET Framework y el esquema al que pertenece. Los tipos definidos por el usuario de .NET Framework se crean con la instrucción CREATE TYPE antes de que puedan utilizarse en una definición de tabla.

    A continuación se indican los criterios de type_name en una columna alterada:

    • El tipo de datos anterior debe poderse convertir implícitamente al nuevo tipo de datos.
    • type_name no puede ser timestamp.
    • Los valores predeterminados de ANSI_NULL están siempre activados para ALTER COLUMN; si no se especifican, la columna acepta el valor NULL.
    • El relleno ANSI_PADDING está siempre activado para ALTER COLUMN.
    • Si la columna alterada es una columna de identidad, new_data_type debe ser de un tipo de datos compatible con la propiedad de la identidad.
    • La configuración actual de SET ARITHABORT se pasa por alto. ALTER TABLE opera como si la opción ARITHABORT estuviera activada.

    [!NOTA] Si no se especifica la cláusula COLLATE, la modificación de un tipo de datos de columna tendrá como resultado un cambio de intercalación a la intercalación predeterminada de la base de datos.

  • max
    Sólo se aplica a los tipos de datos varchar, nvarchar y varbinary para el almacenamiento de 2^31-1 bytes caracteres, datos binarios y datos Unicode.
  • xml_schema_collection
    Sólo se aplica al tipo de datos xml para asociar un esquema XML con el tipo. Antes de escribir una columna xml en una colección de esquemas, la colección de esquemas debe crearse en la base de datos mediante el uso de CREATE XML SCHEMA COLLECTION.
  • COLLATE < collation_name >
    Especifica la nueva intercalación para la columna alterada. Si no se especifica, se asigna a la columna la intercalación predeterminada de la base de datos. El nombre de intercalación puede ser un nombre de intercalación de Windows o un nombre de intercalación de SQL. Para obtener más información y una lista de nombres de intercalación, Nombre de intercalación de Windows (Transact-SQL) y Nombre de intercalación de SQL (Transact-SQL).

    Es posible utilizar la cláusula COLLATE sólo para alterar las intercalaciones de las columnas cuyo tipo de datos sea char, varchar, nchar y nvarchar. Para modificar la intercalación de una columna de tipo de datos de alias definido por el usuario, debe ejecutar distintas instrucciones ALTER TABLE para cambiar la columna por un tipo de datos del sistema de SQL Server y modificar su intercalación, y a continuación volver a modificar la columna para que sea un tipo de datos de alias.

    ALTER COLUMN no puede tener un cambio de intercalación si existe alguna de las siguientes condiciones:

    • Si una restricción CHECK, una restricción FOREIGN KEY o las columnas calculadas hacen referencia a la columna cambiada.
    • Si se ha creado algún índice, estadística o índice de texto en la columna. Las estadísticas creadas automáticamente en la columna cambiada se quitarán si se altera la intercalación de columna.
    • Si una función o vista enlazada a esquema hace referencia a la columna.

    Para obtener más información, vea COLLATE (Transact-SQL).

  • NULL | NOT NULL
    Especifica si la columna puede aceptar valores NULL. Las columnas que no permiten valores NULL sólo se pueden agregar con ALTER TABLE si tienen especificado un valor predeterminado o si la tabla está vacía. NOT NULL sólo puede especificarse para las columnas si también se especifica PERSISTED. Si la nueva columna permite valores NULL y no se especifica un valor predeterminado, la nueva columna contendrá un valor NULL en cada fila de la tabla. Si la nueva columna permite valores NULL y se agrega una definición predeterminada con la nueva columna, se puede utilizar la opción WITH VALUES para almacenar el valor predeterminado en la nueva columna para cada fila existente en la tabla.

    Si la nueva columna no permite valores NULL y la tabla no está vacía, debe agregarse una definición DEFAULT con la nueva columna y ésta se carga automáticamente con el valor predeterminado en las nuevas columnas de cada fila existente.

    NULL puede especificarse en ALTER COLUMN para forzar que una columna NOT NULL permita valores NULL, excepto en el caso de las columnas de las restricciones PRIMARY KEY. NOT NULL sólo se puede especificar en ALTER COLUMN si la columna no contiene valores NULL. Los valores NULL deben actualizarse a algún valor para poder permitir ALTER COLUMN NOT NULL, como:

    UPDATE MyTable SET NullCol = N'some_value' WHERE NullCol IS NULL
    ALTER TABLE MyTable ALTER COLUMN NullCOl NVARCHAR(20) NOT NULL
    

    Cuando cree o altere una tabla con las instrucciones CREATE TABLE o ALTER TABLE, los valores de sesión y de la base de datos influirán y, posiblemente, anularán la capacidad de aceptar NULL para el tipo de datos utilizado en la definición de una columna. Se recomienda que defina siempre explícitamente una columna como NULL o NOT NULL, en el caso de columnas no calculadas, o si utiliza un tipo de datos definido por el usuario, que permita a la columna emplear la capacidad de aceptar valores NULL predeterminada del tipo de datos. Para obtener más información, vea CREATE TABLE (Transact-SQL).

    [!NOTA] Si se especifica NULL o NOT NULL con ALTER COLUMN, también se debe especificar new_data_type [(precision [, scale ])]. Si el tipo de datos, la precisión y la escala no se cambian, especifique los valores actuales de la columna.

  • [ {ADD | DROP} ROWGUIDCOL ]
    Especifica que la propiedad ROWGUIDCOL se agrega a la columna indicada o se quita de ella. ROWGUIDCOL indica que la columna es una columna GUID de fila. Sólo puede designarse una columna uniqueidentifier por tabla como la columna ROWGUIDCOL, y la propiedad ROWGUIDCOL sólo puede asignarse a una columna uniqueidentifier. ROWGUIDCOL no puede asignarse a una columna de un tipo de datos definido por el usuario.

    ROWGUIDCOL no fuerza la exclusividad de los valores almacenados en la columna y no genera automáticamente valores para las nuevas filas que se insertan en la tabla. Para generar valores únicos para cada columna, utilice la función NEWID en instrucciones INSERT o especifique la función NEWID como la predeterminada para la columna.

  • [ {ADD | DROP} PERSISTED ]
    Especifica que la propiedad PERSISTED se agrega a la columna indicada o se quita de ella. La columna debe ser una columna calculada definida mediante una expresión determinista. Para las columnas especificadas como PERSISTED, el SQL Server 2005 Database Engine (Motor de base de datos de SQL Server 2005) almacena físicamente los valores calculados en la tabla y actualiza los valores cuando se actualiza una de las otras columnas de las que depende la columna calculada. Al marcar una columna calculada como PERSISTED, puede crear índices sobre columnas calculadas definidas sobre expresiones que son deterministas, pero no precisas. Para obtener más información, vea Crear índices en columnas calculadas.

    Las columnas calculadas que se utilizan como columna de partición de una tabla con particiones debe marcarse explícitamente como PERSISTED.

  • WITH CHECK | WITH NOCHECK
    Especifica si los datos de la tabla se han validado o no frente a una restricción FOREIGN KEY o CHECK recién agregada o habilitada de nuevo. Si no se especifica, se asume WITH CHECK para las restricciones nuevas y WITH NOCHECK para las restricciones que se han habilitado otra vez.

    Si no desea volver a comprobar las nuevas restricciones CHECK o FOREIGN KEY con los datos existentes, utilice WITH NOCHECK. No se recomienda que haga esto, excepto en casos muy contados. La nueva restricción se evaluará en todas las actualizaciones futuras. Las infracciones de restricción que se supriman mediante WITH NOCHECK cuando se agrega la restricción pueden hacer que fallen las actualizaciones futuras si actualizan filas con datos que no cumplan la restricción.

    El optimizador de consultas no considera las restricciones definidas como WITH NOCHECK. Estas restricciones se pasan por alto hasta que se vuelven a habilitar mediante ALTER TABLE table CHECK CONSTRAINT ALL.

  • ADD
    Especifica que se agregan una o más definiciones de columna, definiciones de columnas calculadas o restricciones de tabla.
  • DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }
    Especifica que constraint_name o column_name se ha quitado de la tabla. Se pueden enumerar múltiples columnas y restricciones. DROP COLUMN no está permitido si el nivel de compatibilidad es 65 o anterior. Para obtener más información, vea sp_dbcmptlevel (Transact-SQL).

    El nombre de la restricción, sea proporcionado por el sistema o definido por el usuario, puede determinarse mediante la consulta de las vistas de catálogo sys.check_constraint, sys.default_constraints, sys.key_constraints y sys.foreign_keys.

    Una restricción PRIMARY KEY no puede quitarse si existe un índice XML en la tabla.

    Una columna no puede quitarse cuando:

    • Se utiliza en un índice.
    • Se utiliza en una restricción CHECK, FOREIGN KEY, UNIQUE o PRIMARY KEY.
    • Está asociada con un valor predeterminado definido con la palabra clave DEFAULT o enlazada a un objeto predeterminado.
    • Está enlazada a una regla.

    [!NOTA] Quitar una columna no recupera el espacio en disco de la columna. Tendrá que recuperar el espacio en disco de una columna quitada cuando el tamaño de fila de una tabla esté a punto de exceder su límite o lo haya hecho ya. Recupere el espacio mediante la creación de un índice agrupado de la tabla o regenerando un índice agrupado existente mediante la utilización de ALTER INDEX.

  • WITH <drop_clustered_constraint_option>
    Especifica que se ha establecido una o más opciones para quitar restricciones agrupadas.
  • MAXDOP = max_degree_of_parallelism
    Suplanta la opción de configuración max degree of parallelism sólo durante la operación. Para obtener más información, vea max degree of parallelism (opción).

    Utilice la opción MAXDOP para limitar el número de procesadores utilizados en la ejecución de planes paralelos. El máximo es 64 procesadores.

    max_degree_of_parallelism puede tener uno de los siguientes valores:

    • 1
      Suprime la generación de planes paralelos.
    • >1
      Restringe el número máximo de procesadores utilizados en una operación de índice paralelo para el número especificado.
    • 0 (predeterminado)
      Utiliza el número actual de procesadores o menos de acuerdo con la carga actual de trabajo del sistema.

    Para obtener más información, vea Configurar operaciones de índice en paralelo.

    [!NOTA] Las operaciones de índices paralelos sólo están disponibles en SQL Server 2005 Enterprise Edition.

  • ONLINE = { ON | OFF }
    Especifica si las tablas subyacentes y los índices asociados están disponibles para consultas y modificación de datos durante la operación de índice. El valor predeterminado es OFF.

    • ON
      Los bloqueos de tabla de larga duración no se mantienen durante la operación de índice. Durante la fase principal de la operación de índice, sólo un bloqueo de intención compartida (IS) se mantiene en la tabla de origen. De esta forma, las consultas o actualizaciones realizadas sobre la tabla y los índices subyacentes pueden continuar. Al principio de la operación, se mantiene un bloqueo compartido (S) sobre el objeto de origen durante un breve espacio de tiempo. Al final de la operación, durante un breve espacio de tiempo, se adquiere un bloqueo compartido (S) sobre el origen si se está creando un índice no agrupado; o se adquiere un bloqueo SCH-M (modificación del esquema) cuando se crea o se quita un índice agrupado con conexión y cuando se regenera un índice agrupado o no agrupado. ONLINE no puede establecerse en ON cuando se está creando un índice en una tabla temporal local.
    • OFF
      Los bloqueos de tabla se aplican durante la operación de índice. Una operación de índice sin conexión que crea, regenera o quita un índice agrupado, o regenera o quita un índice no agrupado, adquiere un bloqueo de modificación del esquema (Sch-M) sobre la tabla. De esta forma se impide el acceso de todos los usuarios a la tabla subyacente durante la operación. Una operación de índice sin conexión que crea un índice no agrupado adquiere un bloqueo compartido (S) sobre la tabla. De esta forma se impiden las actualizaciones en la tabla subyacente pero se permiten las operaciones de lectura, como las instrucciones SELECT.

    Para obtener más información, vea Cómo funcionan las operaciones de índice en línea. Para obtener más información acerca de los bloqueos, vea Modos de bloqueo.

    [!NOTA] Las operaciones de índices en línea únicamente pueden realizarse en SQL Server 2005 Enterprise Edition.

  • MOVE TO ( partition_scheme_name ( column_name [ 1**,** ... n] ) | filegroup | "default"}
    Especifica una ubicación a la que mover las filas de datos que se encuentran en el nivel hoja del índice agrupado. La tabla se mueve a la nueva ubicación.

    [!NOTA] En este contexto, default no es una palabra clave. Es un identificador para el grupo de archivos predeterminado y debe delimitarse, como en MOVE TO "default" o en MOVE TO [default]. Si se especifica "default", la opción QUOTED_IDENTIFIER debe estar ON para la sesión actual. Ésta es la configuración predeterminada. Para obtener más información, vea SET QUOTED_IDENTIFIER (Transact-SQL).

  • { CHECK | NOCHECK } CONSTRAINT
    Especifica si constraint_name está habilitado o deshabilitado. Esta opción sólo se puede utilizar con las restricciones FOREIGN KEY y CHECK. Cuando se especifica NOCHECK, la restricción se deshabilita y las posteriores inserciones o actualizaciones de la columna no se validan con las condiciones de la restricción. Las restricciones DEFAULT, PRIMARY KEY y UNIQUE no se pueden deshabilitar.
  • ALL
    Especifica que todas las restricciones están deshabilitadas con la opción NOCHECK o habilitadas con la opción CHECK.
  • { ENABLE | DISABLE } TRIGGER
    Especifica si trigger_name está habilitado o deshabilitado. Aunque un desencadenador esté deshabilitado, sigue estando definido para la tabla; sin embargo, si se ejecutan las instrucciones INSERT, UPDATE o DELETE en la tabla, las acciones del desencadenador no se ejecutan hasta que éste se vuelva a habilitar.
  • ALL
    Especifica si todos los desencadenadores de la tabla están habilitados o deshabilitados.
  • trigger_name
    Especifica el nombre del desencadenador que se va a habilitar o deshabilitar.
  • SWITCH [ PARTITION source_partition_number_expression ] TO target_table [ PARTITION target_ partition_number_expression ]
    Modifica un bloqueo de datos de una de las formas siguientes:

    • Vuelve a asignar todos los datos de una tabla como una partición en una tabla con particiones ya existente.
    • Modifica una partición de una tabla con particiones a otra.
    • Vuelve a asignar todos los datos de una partición de una tabla con particiones a una tabla con particiones ya existente.

    Si table es una tabla con particiones, se debe especificar source_partition_number_expression. Si target_table es una tabla con particiones, se debe especificar target_partition_number_expression. Si se vuelven a asignar los datos de una tabla como partición a una tabla con particiones ya existente, o se modifica una partición de una tabla con particiones a otra, la partición de destino debe existir y debe estar vacía.

    Si se vuelven a asignar los datos de una partición para formar una sola tabla, la tabla de destino debe ya estar creada y vacía. Tanto la tabla o partición de origen como la tabla o partición de destino deben residir en el mismo grupo de archivos. Los índices correspondientes, o particiones de índice, también deben residir en el mismo grupo de archivos. Son muchas las restricciones adicionales que se aplican a las particiones que se modifican. Para obtener más información, vea Transferir datos de forma eficaz con cambios de particiones. table y target_table no pueden ser la misma. target_table puede ser un identificador con varias partes.

    source_partition_number_expression y target_partition_number_expression son expresiones constantes que pueden hacer referencia a variables y funciones. Incluyen las variables de tipos definidos por el usuario y las funciones definidas por el usuario. No pueden hacer referencia a las expresiones Transact-SQL.

    [!NOTA] No puede utilizar la instrucción SWITCH en tablas replicadas.

Notas

Para agregar nuevas filas de datos, utilice INSERT. Para quitar filas de datos, utilice DELETE o TRUNCATE TABLE. Para cambiar los valores de las filas existentes, utilice UPDATE.

Si hubiera algún plan de ejecución en la caché del procedimiento que hace referencia a la tabla, ALTER TABLE los marca para que se vuelvan a compilar en la siguiente ejecución.

Cambiar el tamaño de una columna

Puede cambiar la longitud, precisión o escala de una columna si especifica un nuevo tamaño para el tipo de datos de columna en la cláusula ALTER COLUMN. Si los datos existen en la columna, el nuevo tamaño no puede ser menor que la longitud máxima de los datos. Asimismo, la columna no se puede definir en un índice, a menos que la columna sea un tipo de datos varchar, nvarchar o varbinary y que el índice no sea el resultado de una restricción PRIMARY KEY. Vea el ejemplo P.

Bloqueos y ALTER TABLE

Los cambios especificados en ALTER TABLE se ejecutan inmediatamente. Si los cambios requieren modificaciones de las filas de la tabla, ALTER TABLE actualiza las filas. ALTER TABLE adquiere un bloqueo de modificación del esquema sobre la tabla para garantizar que ninguna otra conexión haga referencia ni a los metadatos de la tabla durante el cambio, excepto las operaciones de indización con conexión que precisen un breve bloqueo SCH-M al final. En una operación ALTER TABLE…SWITCH, el bloqueo se adquiere tanto en las tablas de origen como en las de destino. Las modificaciones realizadas a la tabla se registran y son completamente recuperables. Los cambios que afectan a todas las filas de tablas muy grandes, como quitar una columna o agregar una columna NOT NULL con un valor predeterminado, pueden requerir mucho tiempo para su finalización y generan muchos registros. Estas instrucciones ALTER TABLE deben ejecutarse con el mismo cuidado que cualquier instrucción INSERT, UPDATE o DELETE que afecte a un gran número de filas.

Ejecución de planes paralelos

En SQL Server 2005 Enterprise Edition, el número de procesadores utilizados para ejecutar una sola instrucción ALTER TABLE ADD (basada en índices) CONSTRAINT o DROP (índice agrupado) CONSTRAINT viene determinado por la opción de configuración max degree of parallelism y la carga de trabajo actual. Si el Database Engine (Motor de base de datos) detecta que el sistema está ocupado, el grado de paralelismo de la operación se reduce automáticamente antes de comenzar la ejecución de la instrucción. Puede configurar manualmente el número de procesadores que se utilizan para ejecutar la instrucción si especifica la opción MAXDOP.

Tablas con particiones

Además de realizar operaciones SWITCH que implican a tablas con particiones, ALTER TABLE puede utilizarse para cambiar el estado de las columnas, restricciones y desencadenadores de una tabla con particiones, de la misma forma que se utiliza para las tablas sin particiones. Sin embargo, esta sentencia no puede utilizarse para cambiar la forma en que se realizan las particiones de la tabla misma. Para volver a realizar las particiones de una tabla con particiones, utilice ALTER PARTITION SCHEME y ALTER PARTITION FUNCTION. Además, no puede cambiar el tipo de datos de una columna de una tabla con particiones.

Restricciones en tablas con vistas enlazadas a esquema

Las restricciones que se aplican a instrucciones ALTER TABLE en tablas con vistas enlazadas a esquema son las mismas que las restricciones que se aplican actualmente cuando se alteran tablas con un solo índice. Se permite agregar una columna. No obstante, no se permite quitar ni cambiar una columna que participa en una vista enlazada a esquema. Si la instrucción ALTER TABLE requiere la alteración de una columna que se utiliza en una vista enlazada a esquema, se produce un error en ALTER TABLE y el Database Engine (Motor de base de datos) genera un mensaje de error. Para obtener más información acerca de los enlaces a esquemas y vistas indizadas, vea CREATE VIEW (Transact-SQL).

La creación de una vista enlazada a esquema que hace referencia a las tablas no afecta a la adición ni a la eliminación de desencadenadores en las tablas base.

Índices y ALTER TABLE

Los índices creados como parte de una restricción se quitan cuando se quita la restricción. Los índices que se crearon con CREATE INDEX deben quitarse con DROP INDEX. La instrucción ALTER INDEX se puede emplear para volver a crear un índice que es parte de una definición de restricción; no es necesario quitar o agregar de nuevo la restricción con ALTER TABLE.

Todos los índices y restricciones basados en una columna deben eliminarse para que se pueda quitar la columna.

Cuando se elimina una restricción que ha creado un índice agrupado, las filas de datos que se han almacenado en el nivel hoja del índice agrupado se almacenan en una tabla no agrupada. En SQL Server 2005, puede quitar el índice agrupado y mover la tabla resultante a otro grupo de archivos o esquema de partición en una sola transacción si especifica la opción MOVE TO. La opción MOVE TO tiene las siguientes restricciones:

  • MOVE TO no es válido para vistas indizadas o índices no agrupados.
  • El esquema de partición o el grupo de archivos debe existir previamente.
  • Si no se especifica MOVE TO, la tabla se ubicará en el mismo esquema de partición o grupo de archivos que se definió para el índice agrupado.

Cuando quita un índice agrupado, puede especificar la opción ONLINE = ON para que la transacción DROP INDEX no bloquee las consultas y modificaciones en los datos subyacentes y en los índices no agrupados asociados.

ONLINE = ON tiene las siguientes restricciones:

  • ONLINE = ON no es válida para índices agrupados que también estén deshabilitados. Los índices deshabilitados deben quitarse con ONLINE = OFF.
  • Sólo un índice puede quitarse cada vez.
  • ONLINE = ON no es válida para las vistas indizadas, índices no agrupados ni índices de tablas temporales locales.

Para quitar un índice agrupado, se necesita un espacio temporal en disco del mismo tamaño que el del índice agrupado existente. Este espacio adicional se libera en cuanto finaliza la operación.

[!NOTA] Las opciones enumeradas en <drop_clustered_constraint_option> se aplican a índices agrupados de tablas y no pueden aplicarse a índices agrupados de vistas o de índices no agrupados.

Replicar cambios de esquema

De forma predeterminiada, cuando se ejecuta ALTER TABLE en una tabla publicada en un publicador de SQL Server, el cambio se propaga a todos los suscriptores de SQL Server. Esta funcionalidad tiene algunas restricciones y se puede deshabilitar. Para obtener más información, vea Realizar cambios de esquema en las bases de datos de publicaciones.

Permisos

Necesita el permiso ALTER para la tabla.

Los permisos ALTER TABLE se aplican a las tablas relacionadas con una instrucción ALTER TABLE SWITCH. Los datos que se modifican heredan la seguridad de la tabla de destino.

Si se define alguna columna de la instrucción ALTER TABLE para que sea un tipo definido por el usuario de CLR (Common Language Runtime) o un tipo de datos del alias, se necesita el permiso REFERENCES sobre el tipo.

Ejemplos

A. Agregar una nueva columna

En el ejemplo siguiente se agrega una columna que permite valores NULL y a la que no se han proporcionado valores mediante una definición DEFAULT. En la nueva columna, cada fila tendrá valores NULL.

CREATE TABLE dbo.doc_exa (column_a INT) ;
GO
ALTER TABLE dbo.doc_exa ADD column_b VARCHAR(20) NULL ;
GO
EXEC sp_help doc_exa ;
GO
DROP TABLE dbo.doc_exa ;
GO

B. Quitar una columna

En el ejemplo siguiente se modifica una tabla para quitar una columna.

CREATE TABLE dbo.doc_exb (column_a INT, column_b VARCHAR(20) NULL) ;
GO
ALTER TABLE dbo.doc_exb DROP COLUMN column_b ;
GO
EXEC sp_help doc_exb ;
GO
DROP TABLE dbo.doc_exb ;
GO

C. Cambiar el tipo de datos de una columna

En el ejemplo siguiente se modifica una columna de una tabla de INT a DECIMAL.

CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE dbo.doc_exy ;
GO

D. Agregar una columna con una restricción

En el ejemplo siguiente se agrega una nueva columna con una restricción UNIQUE.

CREATE TABLE dbo.doc_exc (column_a INT) ;
GO
ALTER TABLE dbo.doc_exc ADD column_b VARCHAR(20) NULL 
    CONSTRAINT exb_unique UNIQUE ;
GO
EXEC sp_help doc_exc ;
GO
DROP TABLE dbo.doc_exc ;
GO

E. Agregar una restricción CHECK no comprobada a una columna existente

En el ejemplo siguiente se agrega una restricción a una columna existente de la tabla. La columna tiene un valor que infringe la restricción. Por lo tanto, WITH NOCHECK se utiliza para evitar que la restricción se valide en las filas existentes, y para poder agregar la restricción.

CREATE TABLE dbo.doc_exd ( column_a INT) ;
GO
INSERT INTO dbo.doc_exd VALUES (-1) ;
GO
ALTER TABLE dbo.doc_exd WITH NOCHECK 
ADD CONSTRAINT exd_check CHECK (column_a > 1) ;
GO
EXEC sp_help doc_exd ;
GO
DROP TABLE dbo.doc_exd ;
GO

F. Agregar una restricción DEFAULT a una columna existente

En el ejemplo siguiente se crea una tabla con dos columnas y se inserta un valor en la primera columna, y el orden de la columna sigue siendo NULL. A continuación se agrega una restricción DEFAULT a la segunda columna. Para comprobar que se aplica el valor predeterminado, se inserta otro valor en la primera columna y se consulta la tabla.

CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO

G. Agregar varias columnas con restricciones

En el ejemplo siguiente se agregan varias columnas con restricciones que se definen con la nueva columna. La primera columna nueva tiene una propiedad IDENTITY. Cada fila de la tabla tiene nuevos valores incrementales en la columna de identidad.

CREATE TABLE dbo.doc_exe ( column_a INT CONSTRAINT column_a_un UNIQUE) ;
GO
ALTER TABLE dbo.doc_exe ADD 

-- Add a PRIMARY KEY identity column.
column_b INT IDENTITY
CONSTRAINT column_b_pk PRIMARY KEY, 

-- Add a column that references another column in the same table.
column_c INT NULL  
CONSTRAINT column_c_fk 
REFERENCES doc_exe(column_a),

-- Add a column with a constraint to enforce that 
-- nonnull data is in a valid telephone number format.
column_d VARCHAR(16) NULL 
CONSTRAINT column_d_chk
CHECK 
(column_d LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
column_d LIKE
'([0-9][0-9][0-9]) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'),

-- Add a nonnull column with a default.
column_e DECIMAL(3,3)
CONSTRAINT column_e_default
DEFAULT .081 ;
GO
EXEC sp_help doc_exe ;
GO
DROP TABLE dbo.doc_exe ;
GO

H. Agregar una columna que acepta valores NULL con valores predeterminados

En el ejemplo siguiente se agrega una columna que acepta valores NULL con una definición DEFAULT y se utiliza WITH VALUES para proporcionar los valores de cada fila existente en la tabla. Si no se utiliza WITH VALUES, cada fila tiene el valor NULL en la nueva columna.

USE AdventureWorks ; 
GO
CREATE TABLE dbo.doc_exf ( column_a INT) ;
GO
INSERT INTO dbo.doc_exf VALUES (1) ;
GO
ALTER TABLE dbo.doc_exf 
ADD AddDate smalldatetime NULL
CONSTRAINT AddDateDflt
DEFAULT GETDATE() WITH VALUES ;
GO
DROP TABLE dbo.doc_exf ;
GO

I. Deshabilitar y volver a habilitar una restricción

En el ejemplo siguiente se deshabilita una restricción que limita los salarios aceptados en los datos. NOCHECK CONSTRAINT se utiliza con ALTER TABLE para deshabilitar la restricción y permitir una inserción que normalmente infringiría la restricción. CHECK CONSTRAINT vuelve a habilitar la restricción.

CREATE TABLE dbo.cnst_example 
(id INT NOT NULL,
 name VARCHAR(10) NOT NULL,
 salary MONEY NOT NULL
    CONSTRAINT salary_cap CHECK (salary < 100000)
);

-- Valid inserts
INSERT INTO dbo.cnst_example VALUES (1,'Joe Brown',65000);
INSERT INTO dbo.cnst_example VALUES (2,'Mary Smith',75000);

-- This insert violates the constraint.
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);

-- Disable the constraint and try again.
ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (3,'Pat Jones',105000);

-- Re-enable the constraint and try another insert; this will fail.
ALTER TABLE dbo.cnst_example CHECK CONSTRAINT salary_cap;
INSERT INTO dbo.cnst_example VALUES (4,'Eric James',110000) ;

J. Quitar una restricción

En el ejemplo siguiente se quita una restricción UNIQUE de una tabla.

CREATE TABLE dbo.doc_exc ( column_a INT
CONSTRAINT my_constraint UNIQUE) ;
GO
ALTER TABLE dbo.doc_exc DROP CONSTRAINT my_constraint ;
GO
DROP TABLE dbo.doc_exc ;
GO

K. Cambiar las particiones entre tablas

En el ejemplo siguiente se crea una tabla con particiones, suponiendo que el esquema de partición myRangePS1 ya esté creado en la base de datos. A continuación, se crea una tabla sin particiones con la misma estructura que la tabla con particiones y en el mismo grupo de archivos que PARTITION 2 de la tabla PartitionTable. Los datos de PARTITION 2 de la tabla PartitionTable se cambian entonces a la tabla NonPartitionTable.

CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
CREATE TABLE NonPartitionTable (col1 int, col2 char(10))
ON test2fg ;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;
GO

L. Deshabilitar y volver a habilitar un desencadenador

En el ejemplo siguiente se utiliza la opción DISABLE TRIGGER de ALTER TABLE para deshabilitar el desencadenador y permitir una inserción que normalmente infringe el desencadenador. A continuación, ENABLE TRIGGER se utiliza para volver a habilitar el desencadenador.

CREATE TABLE dbo.trig_example 
(id INT, 
name VARCHAR(12),
salary MONEY) ;
GO
-- Create the trigger.
CREATE TRIGGER dbo.trig1 ON dbo.trig_example FOR INSERT
AS
IF (SELECT COUNT(*) FROM INSERTED
WHERE salary > 100000) > 0
BEGIN
    print 'TRIG1 Error: you attempted to insert a salary > $100,000'
    ROLLBACK TRANSACTION
END ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (1,'Pat Smith',100001) ;
GO
-- Disable the trigger.
ALTER TABLE dbo.trig_example DISABLE TRIGGER trig1 ;
GO
-- Try an insert that would typically violate the trigger.
INSERT INTO dbo.trig_example VALUES (2,'Chuck Jones',100001) ;
GO
-- Re-enable the trigger.
ALTER TABLE dbo.trig_example ENABLE TRIGGER trig1 ;
GO
-- Try an insert that violates the trigger.
INSERT INTO dbo.trig_example VALUES (3,'Mary Booth',100001) ;
GO

M. Crear una restricción PRIMARY KEY con opciones de índice

En el ejemplo siguiente se crea la restricción PRIMARY KEY PK_TransactionHistoryArchive_TransactionID y se establecen las opciones FILLFACTOR, ONLINE y PAD_INDEX. El índice agrupado resultante tendrá el mismo nombre que la restricción.

USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive WITH NOCHECK 
ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID PRIMARY KEY CLUSTERED (TransactionID)
WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON)
GO

N. Eliminar una restricción KEY PRIMARY en modo ONLINE

En el ejemplo siguiente se elimina una restricción KEY PRIMARY con la opción ONLINE establecida en ON.

USE AdventureWorks;
GO
ALTER TABLE Production.TransactionHistoryArchive
DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID
WITH (ONLINE = ON);
GO

O. Agregar y quitar una restricción FOREIGN KEY

En el ejemplo siguiente se crea la tabla ContactBackup y a continuación se altera la tabla; primero se agrega una restricción FOREIGN KEY que hace referencia a la tabla Contact y a continuación se quita la restricción FOREIGN KEY.

USE AdventureWorks ;
GO
CREATE TABLE Person.ContactBackup
(ContactID int) ;
GO
ALTER TABLE Person.ContactBackup
ADD CONSTRAINT FK_ContactBacup_Contact FOREIGN KEY (ContactID)
    REFERENCES Person.Contact (ContactID) ;
ALTER TABLE Person.ContactBackup
DROP CONSTRAINT FK_ContactBacup_Contact ;
GO
DROP TABLE Person.ContactBackup ;

P. Cambiar el tamaño de una columna

El ejemplo siguiente aumenta el tamaño de una columna varchar y la precisión y escala de una columna decimal. Dado que las columnas contienen los datos, sólo se puede aumentar el tamaño de columna. Observe también que col_a se define en un índice único. Se puede aumentar el tamaño de col_a porque el tipo de datos es varchar y el índice no es el resultado de una restricción PRIMARY KEY.

IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL 
    DROP TABLE dbo.doc_exy;
GO
-- Create a two-column table with a unique index on the varchar column.
CREATE TABLE dbo.doc_exy ( col_a varchar(5) UNIQUE NOT NULL, col_b decimal (4,2));
GO
INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
GO
-- Increase the size of the varchar column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_a varchar(25);
GO
-- Increase the scale and precision of the decimal column.
ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal (10,4);
GO
-- Insert a new row.
INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999) ;
GO
-- Verify the current column size.
SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');

Vea también

Referencia

sp_rename (Transact-SQL)
CREATE TABLE (Transact-SQL)
DROP TABLE (Transact-SQL)
sp_help (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
ALTER PARTITION FUNCTION (Transact-SQL)
EVENTDATA (Transact-SQL)

Otros recursos

Crear y modificar tablas
Realizar cambios de esquema en las bases de datos de publicaciones

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial

15 de septiembre de 2007

Contenido modificado:
  • Se agregó la sección 'Cambiar el tamaño de una columna' y el ejemplo P.

12 de diciembre de 2006

Contenido modificado:
  • Se ha aclarado la colocación y el significado de la cláusula NOT FOR REPLICATION en las secciones de sintaxis y argumentos.
  • Se ha aclarado que la tabla de destino de una cláusula SWITCH puede expresarse como un identificador de varias partes.

14 de abril de 2006

Contenido nuevo:
  • Se ha documentado que no se puede utilizar la instrucción SWITCH en tablas replicadas.

5 de diciembre de 2005

Contenido nuevo:
  • Se ha agregado la cláusula DROP NOT FOR REPLICATION al diagrama de sintaxis y a la lista de definición de argumentos.
Contenido modificado:
  • Se ha movido la cláusula COLLATE a la posición correcta en el diagrama de sintaxis.
  • Se han corregido los ejemplos M y N.