【问题标题】:How to change primary key with foreign key constraints that is not auto-increment to auto-increment?如何将具有非自增外键约束的主键更改为自增?
【发布时间】:2015-11-12 14:22:34
【问题描述】:

我有一张桌子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 更改为自动增量?

【问题讨论】:

  • 在操作前禁用所有 FK,然后重新启用它们。见this question
  • 删除 FK 然后重新添加它们。
  • @TabAlleman :这个ALTER TABLE [myTable] NOCHECK CONSTRAINT ALL 没有帮助,SQL Server 不会检查我在引用列中输入的值的内容,好的,但它仍然显示相同的消息。
  • @ZoffDino : 这个ALTER TABLE [myTable] NOCHECK CONSTRAINT ALL 没有帮助,SQL Server 不会检查我在引用列中输入的值的内容,好的,但它仍然显示相同的消息
  • 不知道你从哪里得到的,但我说的是DROP FK,然后重新创建它们。

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


【解决方案1】:

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

select max(EmpId)
from employees

然后将员工 empid 更新为 IsIdentity = Yes and IdentitySeed = "最大id查询的结果"

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

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 2016-04-28
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多