Я веб-разработчик с правами администратора на нашем SQLServer, и мне нужно добавить целочисленный столбец (внешний ключ), не допускающий значения NULL, в существующую таблицу. Я ищу лучший способ создать этот столбец и заполнить его данными.
Пример нового столбца:
branchId (int) non-nullable with a foreign key to the parent table
Пример существующей родительской таблицы Branch:
id (int) auto-incrementing primary key
branchName (varchar)
Я знаю, что могу просто установить значение по умолчанию, указывающее на идентификатор соответствующей записи ветки, но я не решаюсь сделать это, потому что идентификатор ветки может различаться в разных средах.
Моя идея состоит в том, чтобы сначала создать новый столбец branchId как допускающий значение NULL, а затем обновить все записи с правильным идентификатором, получив правильный идентификатор branchId из запроса типа SELECT id FROM Branch WHERE branchName = "Branch 4". Затем я бы вернулся и изменил столбец на значение, не допускающее значения NULL, что должно быть нормально, поскольку у всех теперь есть данные.
Все мои сценарии изменения базы данных хранятся в системе управления версиями, поэтому это основная причина, по которой мне нужно элегантное решение, которое можно было бы запускать в любое время в будущем, независимо от идентификатора ветки.
Как лучше всего это сделать?
Ваш способ - это то, как я бы это сделал - столбец с нулевым значением, обновленные значения, не допускающие значения NULL.
Средний шаг (в SQL Server) можно выполнить, выполнив что-то вроде:
UPDATE
e
SET
e.BranchId = s.BranchId
FROM
ExistingTable e
INNER JOIN SourceTable s
ON e.Column = s.Column
Поскольку я не знаю, как выглядит ваш ERD, я предполагаю, что ваши столбцы JOIN не обязательно являются именем ветки, которое вы описали в вопросе.
Это может быть не изящно, но позволяет избежать добавления шага для получения значения идентификатора из таблицы Branch для значения по умолчанию.
Так что мой ответ - доверять своему инстинкту.