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