更改主键值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更改主键值相关的知识,希望对你有一定的参考价值。

我有10张桌子。每个表由其他5个表的外键引用。

我需要更改这10个表的主键值。有没有办法改变它,以便它会自动更改所有外键?

我正在使用sql server 2008并拥有管理工作室。

答案

您需要为这些外键设置ON UPDATE CASCADE:

ALTER TABLE bar
ADD CONSTRAINT FK_foo_bar
FOREIGN KEY (fooid) REFERENCES foo(id)
ON UPDATE CASCADE

然后您只需更新FK,并且引用字段也将作为事务的一部分进行更新:

UPDATE foo SET id = id + 1000

请注意,要更改约束,需要删除它们。

另一答案

以下是使用ON UPDATE CASCADE外键选项如何执行此操作的示例。您感兴趣的部分是两个ALTER TABLE声明。

如果您使用IDENTITY列作为主键,那么这将变得更加困难,因为您无法更新IDENTITY列。

CREATE TABLE Parent
(
    ParentId INT NOT NULL CONSTRAINT [PK_Parent] PRIMARY KEY CLUSTERED,
    Name VARCHAR(10) NOT NULL
)

CREATE TABLE Child 
(
  ChildId INT NOT NULL CONSTRAINT [PK_Child] PRIMARY KEY CLUSTERED,
  ParentId INT NOT NULL CONSTRAINT [FK_Child_ParentId] FOREIGN KEY REFERENCES Parent (ParentId),
  Name VARCHAR(10) NOT NULL
)

INSERT INTO Parent (ParentId, Name) VALUES (1, 'Bob')
INSERT INTO Parent (ParentId, Name) VALUES (2, 'Sue')

INSERT INTO Child (ChildId, Name, ParentId) VALUES (1, 'Alice', 1)
INSERT INTO Child (ChildId, Name, ParentId) VALUES (2, 'Billy', 2)

SELECT * FROM Child 

-- Drop foreign key constraint and re-add 
ALTER TABLE Child 
  DROP CONSTRAINT [FK_Child_ParentId]

ALTER TABLE Child
 ADD CONSTRAINT [FK_Child_ParentId] 
    FOREIGN KEY (ParentId) REFERENCES Parent (ParentId) ON UPDATE CASCADE 

UPDATE Parent SET ParentId = ParentId + 100 

SELECT * FROM Child --shows the new ParentIds 

DROP TABLE Child 
DROP TABLE Parent 
另一答案

我自己从未这样做过,听起来这可能是一个坏主意。也就是说,我确实发现这篇文章有两种方法:

http://support.microsoft.com/kb/142480

一个使用存储过程和其他触发器。两者看起来都有点痛苦。

另一答案

IDENTITY列的一个显着缺点是它无法直接更新。

解决方法是不在目标表中使用IDENTITY,而是将其放在额外的表中。首先使用IDENTITY列插入表,然后将生成的IDENTITY值插入目标表。

SQL Server 2012引入了与表无关的序列,这是针对同一问题的更好解决方案。序列不需要额外的表。

另一答案

我知道这不是你的问题的答案,但我在寻找如何简单地设置(写入,插入,更新或其他)PK(主键)列时来到这里。

因此,您必须禁用PK约束,插入您的值,然后启用它,更新将不起作用。

SET IDENTITY_INSERT IdentityTable ON
INSERT IdentityTable(TheIdentity, TheValue) VALUES (3, 'First Row')
SET IDENTITY_INSERT IdentityTable OFF

以上是关于更改主键值的主要内容,如果未能解决你的问题,请参考以下文章

先获取代码中任意实体的主键值

自动递增主键值始终为 0

如何检查另一个表中是不是存在主键值?

MyBatis 插入时返回刚插入记录的主键值

如何在竞争条件下将主键值插入表中?

SQL 更新:无法更改第一条记录的复合键值之一