更改主键值

问题描述 投票:0回答:5

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

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

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

sql sql-server sql-server-2008 primary-key
5个回答
4
投票

您需要为这些外键设置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

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


5
投票

以下是使用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 

0
投票

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

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

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


0
投票

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

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

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


0
投票

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

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

SET IDENTITY_INSERT IdentityTable ON
INSERT IdentityTable(TheIdentity, TheValue) VALUES (3, 'First Row')
SET IDENTITY_INSERT IdentityTable OFF
© www.soinside.com 2019 - 2024. All rights reserved.