更改主键值
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
以上是关于更改主键值的主要内容,如果未能解决你的问题,请参考以下文章