Назад | Перейти на главную страницу

Лучший способ добавить новый столбец, не допускающий значения NULL?

Я веб-разработчик с правами администратора на нашем 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 для значения по умолчанию.

Так что мой ответ - доверять своему инстинкту.