Лучший способ добавить новый столбец с начальным (но не по умолчанию) значением? - PullRequest
26 голосов
/ 25 июня 2009

Мне нужно добавить новый столбец в базу данных 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 записей).

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

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

Ответы [ 4 ]

16 голосов
/ 25 июня 2009

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

15 голосов
/ 25 июня 2009

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

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, поэтому я не смог сравнить ресурсы, использованные этими двумя методами.

1 голос
/ 25 июня 2009

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

0 голосов
/ 25 июня 2009

Если вы добавите ограничение по умолчанию при создании таблицы, вы не будете знать, как она называется. Однако, если вы добавляете ограничение с помощью ALTER TABLE, вы должны назвать это ограничение. В этом случае вы сможете ИЗМЕНИТЬ КОНТРАКТ С УСТРОЙСТВОМ ОТКЛЮЧЕНИЯ ТАБЛИЦ (это относится к T-SQL, но не уверен в отношении других баз данных.)

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

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

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

...