如何使用不自动递增到自动递增的外键约束来更改主键?

时间:2015-11-12 14:22:35

标签: sql sql-server sql-server-2008 sql-server-2012 foreign-keys

我有一张表Employees

  • EmpId int not null
  • EmpName nvarchar
  • ...

但是,此表由其他表通过外键引用,即EmpId是其他表中的外键。

此代码无效:

USE MyDatabase

ALTER TABLE [MyDatabase].[EmployeesSchema].[Employees] 
DROP CONSTRAINT PK_Employees

ALTER TABLE [MyDatabase].[EmployeesSchema].[Employees] 
DROP COLUMN EmpId

ALTER TABLE [MyDatabase].[EmployeesSchema].[Employees] 
   ADD TempColumn INT IDENTITY(1,1)

ALTER TABLE [MyDatabase].[EmployeesSchema].[Employees]
   ADD CONSTRAINT PK_Employees PRIMARY KEY (TempColumn)
GO

sp_RENAME '[MyDatabase].[EmployeesSchema].[Employees].TempColumn', 'EmpId' , 'COLUMN'
GO

它产生:

  

约束' PK_Employees'表'客户'正在引用,   外键约束' Employees_Clients_FK'。

即使我有外键约束,如何将EmpId更改为自动递增?

1 个答案:

答案 0 :(得分:0)

如果你可以保留所有以前的id值,你可以:

选择 MAX(EMPID) 来自员工

然后将员工empid更新为IsIdentity = Yes 和IdentitySeed =“最大ID查询的结果”

因此,之后的所有新条目都将具有一个自动生成的列,该列从最高EmpId值开始。这样任何新值都不会与之前的值发生冲突。