更改主键值

时间:2011-08-02 21:51:15

标签: sql sql-server sql-server-2008 primary-key

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

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

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

5 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

所以你必须禁用PK约束,插入你的值,然后启用它,更新将不起作用。

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