Saltar al contenido

SQL Server Cambiar el tipo de datos de la clave principal

Solución:

No puede cambiar la columna de la clave principal, a menos que la suelte … Cualquier operación para cambiar su tipo de datos conducirá al siguiente error …

El objeto ‘XXXX’ depende de la columna ‘XXXX’.

La única opción es

1.Soltar la clave principal
2.cambiar tipo de datos
3.crear la clave principal

ALTER TABLE t1  
DROP CONSTRAINT PK__t1__3213E83F88CF144D;   
GO  

alter table t1 
alter column id varchar(10) not null

alter table t1 add primary key (id)

A partir de 2012, hay una cláusula llamada (DROP_EXISTING = ON) lo que simplifica las cosas, eliminando el índice agrupado en la etapa final y también manteniendo el índice antiguo disponible para todas las operaciones … pero en su caso, esta cláusula no funcionará …

Así que recomiendo

1.crear una nueva tabla con el esquema y los índices deseados, con un nombre diferente
2.insertar datos de la tabla anterior en la tabla nueva
3. finalmente, en el momento del cambio, inserte los datos que se acumularon
4. Cambie el nombre de la tabla al nombre de la tabla anterior.

De esta manera, es posible que tenga menos tiempo de inactividad

Puede cambiar el tipo de fecha de la clave principal en tres pasos

Paso 1: – Elimine la restricción asociada con la clave principal.

ALTER TABLE table_name
 DROP CONSTRAINT constraint_name;

Paso 2: – Altere la columna de clave Primay a un tipo de datos de clave primaria válido

ALTER TABLE  table_name
ALTER COLUMN pk_column_name target_data_type(size) not null;

Paso 3: – Vuelva a hacer la clave principal de la columna modificada

ALTER TABLE table_name
ADD PRIMARY KEY (pk_column_name);

PD: –

  • Puede obtener el nombre de la restricción del mensaje de error cuando intenta modificar pk_column

  • Si ya tiene datos en pk_column, asegúrese de que el tipo de datos de origen y destino de la columna se puedan usar para los datos existentes. de lo contrario, se necesitarían otros dos pasos para mover los datos existentes a una columna temporal y luego realizar los pasos y recuperar esos datos después de examinar y eliminar esa columna temporal.


A continuación se muestra un script que escribí para ayudarnos a implementar un cambio en el tipo de datos de la columna de clave principal.

Este script asume que no hay restricciones de clave no primaria (por ejemplo, claves externas) dependiendo de esta columna.

Tiene algunas verificaciones de seguridad, ya que fue diseñado para implementarse en diferentes servidores (dev, uat, live) sin crear efectos secundarios si la tabla era de alguna manera diferente en un servidor.

Espero que esto ayude a alguien. Por favor, avíseme si encuentra algo incorrecto antes de votar en contra. Estoy más que feliz de actualizar el guión.

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C WITH (NOLOCK) WHERE C.TABLE_CATALOG = '<<DB>>' AND C.TABLE_SCHEMA = 'dbo' AND C.TABLE_NAME = '<<Table>>' 
AND C.COLUMN_NAME = '<<COLUMN>>' AND C.DATA_TYPE = 'int') -- <- Additional test to check the current datatype so this won't make unnecessary or wrong updates
BEGIN
    DECLARE @pkName VARCHAR(200);
    SELECT @pkName = pkRef.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pkRef WITH (NOLOCK)
    WHERE pkRef.TABLE_CATALOG = '<<DB>>' AND pkRef.TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '<<Table>>'

    IF(@pkName IS NOT NULL)
    BEGIN
        -- Make sure the primary key name is the one you are going to use in script beyond this point.
        IF(@pkName != '<<PRIMARY KEY NAME>>') 
        BEGIN
            RAISERROR ('Unexpected primary key name - The primary key found has a different name than expected. Please update the script.', 16, 1);
            RETURN;
        END

        ALTER TABLE dbo.<<Table>>
              DROP CONSTRAINT <<PRIMARY KEY NAME>>; -- Note: this is not a string or a variable (just type the PK name)
        SELECT 'Dropped existing primary key';
    END

    ALTER TABLE dbo.<<Table>> ALTER COLUMN ID BIGINT
    SELECT 'Updated column type to big int';

    ALTER TABLE dbo.<<Table>>
          ADD CONSTRAINT <<PRIMARY KEY NAME>> PRIMARY KEY CLUSTERED (<<COLUMN>>);
    SELECT 'Created the primary key';
END
ELSE
BEGIN
    SELECT 'No change required.';
END
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *