изменить значение первичного ключа - PullRequest
0 голосов
/ 03 августа 2011

у меня 10 таблиц. На каждую таблицу ссылаются внешние ключи других 5 таблиц.

Мне нужно изменить значение первичного ключа этих 10 таблиц. Есть ли способ изменить его так, чтобы он автоматически заменял все внешние ключи?

Я использую SQL Server 2008 и у меня есть студия управления.

Ответы [ 5 ]

5 голосов
/ 03 августа 2011

Вот пример того, как вы можете сделать это, используя параметр внешнего ключа 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 
4 голосов
/ 03 августа 2011

Вам необходимо установить 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

Обратите внимание, что для изменения ограничений их необходимо удалить.

0 голосов
/ 01 марта 2018

Я знаю, что это не совсем ответ на ваш вопрос, но я пришел сюда, когда искал, как просто установить (записать, вставить, обновить или еще) столбец PK (первичный ключ).

Таким образом, вы должны отключить ограничение PK, вставить свое значение и включить его позже, обновления не будут работать.

SET IDENTITY_INSERT IdentityTable ON
INSERT IdentityTable(TheIdentity, TheValue) VALUES (3, 'First Row')
SET IDENTITY_INSERT IdentityTable OFF
0 голосов
/ 03 августа 2011

Существенным недостатком столбца IDENTITY является то, что он не может быть напрямую обновлен.

Обходной путь - не использовать IDENTITY в целевой таблице, а вместо этого поместить ее в дополнительную таблицу.Сначала вставьте в таблицу столбец IDENTITY, затем вставьте сгенерированное значение IDENTITY в целевую таблицу.

В SQL Server 2012 представлены независимые от таблицы последовательности, которые являются лучшим решением той же проблемы.Последовательность не требует дополнительной таблицы.

0 голосов
/ 03 августа 2011

Я никогда не делал этого сам, и звучит так, как будто это плохая идея. Тем не менее, я нашел эту статью, в которой рассматриваются два метода:

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

Один использует хранимые процедуры и другие триггеры. Оба кажутся немного болезненными.

...