Подтвердить что ты не робот

Лучший способ добавить новый столбец с исходным значением (но не по умолчанию)?

Мне нужно добавить новый столбец в базу данных MS SQL 2005 с начальным значением. Однако я не хочу автоматически создавать ограничение по умолчанию для этого столбца. В тот момент, когда я добавляю столбец, значение по умолчанию/исходное значение верное, но со временем это может измениться. Таким образом, будущий доступ к таблице ДОЛЖЕН указать значение, а не принимать значение по умолчанию.

Лучшее, что я мог придумать, это:

ALTER TABLE tbl ADD col INTEGER NULL
UPDATE tbl SET col = 1
ALTER TABLE tbl ALTER COLUMN col INTEGER NOT NULL

Это кажется немного неэффективным для больших таблиц (от 100 000 до 1 000 000 записей).

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

Пожалуйста, должен быть лучший способ.

4b9b3361

Ответ 1

Сначала я был бы ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1, и после этого явным образом вычеркнуто ограничение по имени (предположительно внутри транзакции).

Ответ 2

Чтобы добавить столбец по умолчанию и затем удалить значение по умолчанию, вы можете указать значение по умолчанию:

ALTER TABLE tbl ADD col INTEGER NOT NULL CONSTRAINT tbl_temp_default DEFAULT 1
ALTER TABLE tbl drop constraint tbl_temp_default

Это заполняет значение 1, но оставляет таблицу без значения по умолчанию. Используя SQL Server 2008, я выполнил это и ваш код, alter update alter и не увидел заметной разницы в таблице из 100 000 небольших строк. SSMS не покажет мне планы запросов для операторов alter table, поэтому мне не удалось сравнить ресурсы, используемые между этими двумя методами.

Ответ 3

Вы можете сделать это в триггере вставки

Ответ 4

Если вы добавляете ограничение по умолчанию при создании таблицы, вы не будете знать, что она вызывается. Однако, если вы добавите ограничение с помощью ALTER TABLE, вы должны указать ограничение. В этом случае вы можете использовать ALTER TABLE DROP CONSTRAINT (это относится к T-SQL, но не обязательно о других базах данных.)

Однако для этого потребуется CREATE TABLE с столбцом NULL, ALTER TABLE, чтобы добавить ограничение, сделать столбец NOT NULL и, наконец, DROP CONSTRAINT.

Я не верю, что триггер insert будет работать как кто-то другой, потому что ваши строки уже добавлены.

Я думаю, что способ, которым вы описываете, может быть самым эффективным и элегантным решением.