Замена varchar FK новым Int FK в SQL Server - PullRequest
0 голосов
/ 03 мая 2019

У меня есть две таблицы, которые мы будем называть Event и EventResponse

  • Event имеет PK eventGuid varchar(36) и несколько других столбцов
  • EventResponse имеет FK eventGuid varchar(36) идругие столбцы

Я легко могу добавить столбец INT identity к Event с помощью:

ALTER TABLE dbo.[Event]
   ADD eventId INT IDENTITY;

И добавление столбца в таблицу EventResponse - это нормально.

Как обновить все eventIds в таблице ответов?

Возможно ли это с аккуратным запросом или мне нужно выполнить цикл?

Конечное состояние должно быть:

  • Event имеет PK eventId, eventGuid varchar(36), другие столбцы
  • EventResponse имеет FK eventId, eventGuid varchar(36), другие столбцы

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Зацикливание не требуется.Слова для жизни:)

Это должно быть почти все, что вам нужно.Используйте существующий внешний ключ, чтобы обновить значения для нового ключа, затем отбросьте старую связь и добавьте новую.

UPDATE er
  SET er.eventID = e.eventID
FROM
  dbo.EventResponse AS er
  JOIN
  dbo.Event as e
    ON er.eventGuid = e.eventGuid;

GO 

ALTER TABLE dbo.EventResponse
DROP CONSTRAINT <FK_Name> 

GO

ALTER TABLE dbo.EventResponse
ADD CONSTRAINT <FK_Name> FOREIGN KEY (eventId)
  REFERENCES dbo.Event(eventId)
  [ON DELETE CASCADE
  ON UPDATE CASCADE]

GO

Тогда, возможно, если вы хотите сэкономить место в вашей базе данных:

ALTER TABLE dbo.Event
DROP COLUMN eventGuid;

GO

ALTER TABLE dbo.EventResponse
DROP COLUMN eventGuid;

GO
1 голос
/ 03 мая 2019

попробуйте это:

update a set a.eventId=b.eventId
from EventResponse a
inner join Event b on a.eventGuid = b.eventGuid
...