Necesito cambiar el tipo de columna de mi clave principal en una tabla de int a guid. La base de datos ya tiene datos que no quiero perder, y hay claves externas a considerar. ¿Hay alguna manera fácil de hacerlo o tengo que hacerlo manualmente a través de un gran ** script? :) Agradecería cualquier sugerenciasql server change PK type from int to uniqueidentifier
Respuesta
Tendrá que hacerlo de la manera difícil, utilizando scripts:
0) entrar en el modo de usuario único
1) agregar la nueva columna GUID a la tabla principal y rellenarla.
2) añadir la nueva columna FK a cada tabla secundaria y rellenarlas con una actualización del
UPDATE c
SET FKcolumn=p.NewGuid
FROM ChildTable c
INNER JOIN ParentTable p ON p.OldIntID=c.OldIntId
3) retirar los int FKs
4) Caída de las antiguas columnas int existentes
5) añadir el nuevo FKs en la columna guid
6) salir del modo de usuario único
debe poder conseguir que SQL Server Management studio genere los guiones para agregar y soltar las columnas y claves. Simplemente realice los cambios en SSMS y haga clic en el icono de la barra de herramientas "Generar secuencia de cambio" y podrá cortar y pegar el código en un archivo de texto.
- Use la opción "Generar scripts" en su base de datos para crear "DROP/CREATE CONSTRAINT and INDEXES" (use el botón avanzado para sintonizar el asistente). Ejecutar parte del script SQL creado para eliminar índices y restricciones.
Crear una función auxiliar y el procedimiento de la siguiente manera:
CREATE FUNCTION [dbo].[GuidFromHash] ( @Input nvarchar(MAX) ) RETURNS nvarchar(MAX) AS BEGIN RETURN LOWER(SUBSTRING(@Input, 1,8)+'-'+SUBSTRING(@Input, 9,4)+'-'+SUBSTRING(@Input, 13,4)+'-'+SUBSTRING(@Input, 17,4)+'-'+SUBSTRING(@Input, 21,12)) END CREATE PROCEDURE [dbo].[bigIntToGuid] ( @table varchar(50), @column varchar(50) ) AS DECLARE @SQL VARCHAR(MAX) SET @SQL='UPDATE @Table SET @Column=dbo.HashToGuid(''cc''+CONVERT(VARCHAR, HASHBYTES(''MD5'',LTRIM(@Column)),2))' SET @SQL=REPLACE(@SQL,'@Table',@Table) SET @SQL=REPLACE(@SQL,'@Column',@Column) EXEC(@SQL) SET @SQL='SELECT * FROM @Table' SET @SQL=REPLACE(@SQL,'@Table',@Table) SET @SQL=REPLACE(@SQL,'@Column',@Column) EXEC(@SQL)
Ahora viene el trabajo manual para cada mesa:
- tabla abierta en el diseñador (SQL Management Studio u otra herramienta)
- Cambiar el tipo de columna bigint a VARCHAR (50)
- Ejecutar "EXEC bigIntToGuid 'myTable', 'myBigIntColumn'
- Volver a la tabla de tipos de columna de cambio de diseñador para "uniqueidentifier"
- Opcionalmente se puede añadir un valor por defecto: newid(), y/o un conjunto de columna como clave principal
- Abra la secuencia de comandos SQL generado creado en el paso 1
- Seleccione única porción de la secuencia de comandos para la restricción y la creación de índices, y ejecutarlo
Este enfoque asegura la conversión de int a gUID y mantener la integridad de datos.
Hay un error tipográfico en el fragmento SQL: HashToGuid debe leer GuidFromHash, o el nombre de la función debe cambiarse a HashToGuid. –
- 1. SQL Server 2005 UniqueIdentifier y C# Data Type
- 2. Convertir varchar a UNIQUEIDENTIFIER en SQL Server
- 3. Cómo SQL Server crea uniqueidentifier usando NEWID()
- 4. Mejores prácticas para PK en SQL Server
- 5. SQL Server to Postgres
- 6. Guardar y recuperar RichTextBox.Document from/to SQL?
- 7. BLOB to String, SQL Server
- 8. PyCharm change file type association
- 9. printf too smart casting from char to int?
- 10. C# guid y SQL uniqueidentifier
- 11. MySQL REGEXP to SQL Server
- 12. MySQL change type of foreign key
- 13. SQL Server - SELECT FROM procedimiento almacenado
- 14. SQL Server ¿SELECCIONAR EN @variable?
- 15. SQL Server, donde el campo es int?
- 16. NHibernate.Spatial and Sql 2008 Geography type - How to configure
- 17. SQL Server: inserte siguiente disponible int
- 18. Fire and Forget Sql Server Stored Procedure from C#
- 19. Sql Server change data and log path of existing database
- 20. SQL Server 2008 Change Data Capture, ¿quién realizó el cambio?
- 21. TSQL DateTime to DateKey Int
- 22. LINQ to SQL -
- 23. Camel Route from Jetty to Absolute URL
- 24. Casting anonymous type to dynamic
- 25. sql server 4 byte unsigned int
- 26. Sql Server Legacy Database To Clustered index o no
- 27. Make shopt change local to function
- 28. ¿Cómo se usa CouchDB Change Notifications Continuous Changes from Java?
- 29. Ignorar acentos en SQL Server utilizando LINQ to SQL
- 30. ¿SQL Server admite la cláusula IS DISTINCT FROM?
¿Por qué quieres hacer esto? Actualmente estoy intentando lo opuesto ... – cjk
Yo, también, preferiría recomendar ** no ** hacer eso, ¿alguna razón en particular para esto? –
Necesito hacerlo porque estoy configurando la duplicación de mezcla con varios servidores de suscriptores, y no quiero que mi identificador de fila cambie debido a la sincronización. Además, dado que la duplicación de mezcla agrega automáticamente una columna guid en todas las tablas, si aún no cuenta con una columna PK de guía, una columna ID adicional es redundante. – anakic