我为所有表设计了一个主键类型为uniqueidentifier
的数据库。它有50个表和现有数据。然后,我知道这是一个坏主意。我想从int
更改为uniqueidentifier
pk类型。
我该怎么办?如何移动外键?
答案 0 :(得分:0)
要采取的一般步骤是(链接到有关使用SQL Server执行这些步骤的MSDN信息):
答案 1 :(得分:0)
刚刚完成了一个脚本,在几个表上进行了测试并且工作正常,在生产环境中执行它之前自己测试一下。
脚本执行以下操作。
declare @table SYSNAME,@Schema SYSNAME
, @PkColumn SYSNAME, @ContName SYSNAME
,@Sql nvarchar(max)
DECLARE db_cursor CURSOR LOCAL FORWARD_ONLY FOR
SELECT OBJECT_NAME(O.object_id) AS ConstraintName
,SCHEMA_NAME(O.schema_id) AS SchemaName
,OBJECT_NAME(O.parent_object_id) AS TableName
,c.name ColumName
FROM sys.objects o
inner join sys.columns c ON o.parent_object_id = c.object_id
inner join sys.types t ON c.user_type_id = t.user_type_id
WHERE o.type_desc = 'PRIMARY_KEY_CONSTRAINT'
and t.name = 'uniqueidentifier'
Open db_cursor
fetch next from db_cursor into @ContName , @Schema , @table, @PkColumn
while (@@FETCH_STATUS = 0)
BEGIN
SET @Sql= 'ALTER TABLE ' + QUOTENAME(@Schema) +'.'+ QUOTENAME(@table)
+ ' DROP CONSTRAINT ' + QUOTENAME(@ContName)
Exec sp_executesql @Sql
SET @Sql= 'ALTER TABLE ' + QUOTENAME(@Schema) +'.'+ QUOTENAME(@table)
+ ' DROP COLUMN ' + QUOTENAME(@PkColumn)
Exec sp_executesql @Sql
SET @Sql= 'ALTER TABLE ' + QUOTENAME(@Schema) +'.'+ QUOTENAME(@table)
+ ' ADD ' + QUOTENAME(@PkColumn)
+ ' INT NOT NULL IDENTITY(1,1) '
Exec sp_executesql @Sql
SET @Sql= 'ALTER TABLE ' + QUOTENAME(@Schema) +'.'+ QUOTENAME(@table)
+ ' ADD CONSTRAINT '+ QUOTENAME(@table+'_'+ @PkColumn)
+ ' PRIMARY KEY ('+QUOTENAME(@PkColumn)+')'
Exec sp_executesql @Sql
fetch next from db_cursor into @ContName , @Schema , @table, @PkColumn
END
Close db_cursor
deallocate db_cursor