Ответ 1
Сначала я был бы ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1
, и после этого явным образом вычеркнуто ограничение по имени (предположительно внутри транзакции).
Мне нужно добавить новый столбец в базу данных 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 и помещать данные в базу данных.
Пожалуйста, должен быть лучший способ.
Сначала я был бы ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1
, и после этого явным образом вычеркнуто ограничение по имени (предположительно внутри транзакции).
Чтобы добавить столбец по умолчанию и затем удалить значение по умолчанию, вы можете указать значение по умолчанию:
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, поэтому мне не удалось сравнить ресурсы, используемые между этими двумя методами.
Вы можете сделать это в триггере вставки
Если вы добавляете ограничение по умолчанию при создании таблицы, вы не будете знать, что она вызывается. Однако, если вы добавите ограничение с помощью ALTER TABLE, вы должны указать ограничение. В этом случае вы можете использовать ALTER TABLE DROP CONSTRAINT (это относится к T-SQL, но не обязательно о других базах данных.)
Однако для этого потребуется CREATE TABLE с столбцом NULL, ALTER TABLE, чтобы добавить ограничение, сделать столбец NOT NULL и, наконец, DROP CONSTRAINT.
Я не верю, что триггер insert будет работать как кто-то другой, потому что ваши строки уже добавлены.
Я думаю, что способ, которым вы описываете, может быть самым эффективным и элегантным решением.