Добавить столбец в таблицу sql: ALTER TABLE — изменение таблицы в SQL и работа со столбцами (add delete rename column)
Содержание
Как добавить столбец в таблицу sql
Уже не впервые на форумах встречаю вопрос о том, как добавить новый столбец в определенное место существующей таблицы, скажем, между первым и вторым столбцом. Этот наивный с точки зрения реляционной модели вопрос, тем не менее, имеет некоторый смысл с точки зрения языка SQL.
Я говорю «наивный», поскольку по определению атрибуты отношения не упорядочены, и обращение к значениям атрибута выполняется по его имени, но не по позиции. Что же касается языка SQL, то столбцы в таблице имеют порядок, который задается в операторе CREATE TABLE. Новый же столбец, который добавляется с помощью оператора ALTER TABLE, становится последним в таблице. Т.е. стандарт языка SQL не предусматривает возможности непосредственно добавить столбец в определенную позицию в списке столбцов.
Справедливости ради следует сказать, что некоторые реализации языка SQL расширяют стандарт в этом плане. Например, в MySQL в операторе ALTER TABLE вы можете указать позицию добавляемого столбца (новый столбец может стать первым или после указанного столбца).
Другой вопрос, а зачем это нужно? Мне приходит в голову такой вариант. Скажем, в клиентском приложении для генерации отчетов используется запрос типа
Если потребовалось добавить в таблицу Employees дополнительную информацию о сотрудниках, которая логически должна находиться в определенном месте (например, отчество непосредственно между именем и фамилией), то вместо того, чтобы вносить изменения в клиентские приложения, может оказаться проще изменить структуру таблицы Employees.
Итак, имеется таблица Employees, которая создается следующим оператором:
Теперь нам требуется добавить столбец middle_name (отчество) между столбцами first_name и last_name.
В MySQL это можно сделать просто:
В SQL Server так поступить нельзя, но можно использовать следующий алгоритм:
» создание новой таблицы требуемой структуры;
» копирование данных из таблицы Employees в эту новую таблицу;
» удаление таблицы Employees;
» переименование новой таблицы в таблицу с именем Employees.
Ниже приводятся операторы T-SQL, которые реализуют этот алгоритм.
Обратите внимание, что столбец middle_name допускает NULL-значения. Мы не можем добавить столбец в существующую таблицу (или, как в нашем случае, не задавая значения для этого столбца при копировании данных из таблицы Employees в таблицу Emp_temp), если он не имеет значения по умолчанию. Здесь мы принимаем по умолчанию значение NULL.
Мы можем выполнить два первых шага за одно действие с помощью оператора SELECT INTO, который «на лету» создает новую таблицу:
Оператор CAST позволяет нам тут же задать требуемый тип добавляемого столбца. Остальные столбцы наследуют типы из таблицы-источника.
Если вы хотите проверить работу последнего скрипта, приведите таблицу в исходное состояние, удалив добавленный ранее столбец:
Заметим, что при использовании оператора SELECT INTO теряются ключи. Поэтому нам придется добавить ограничение PRIMARY KEY (первичный ключ) либо во временную таблицу, либо уже в переименованную, чтобы получить в точности требуемую структуру:
Аналогичный алгоритм можно применить и для перестановки уже существующих столбцов. Помимо указанной причины такая перестановка может повысить производительность, связанную с сокращением объема данных, записываемых в журнал транзакций в некоторых реализациях. Это связано со спецификой обработки строк фиксированной и переменной длины. Вот какие рекомендации по этому поводу дает Джо Селко * :
» помещайте первыми нечасто обновляемые столбцы постоянной длины;
» затем помещайте нечасто обновляемые столбцы переменной длины;
» последними помещайте часто обновляемые столбцы;
» ставьте рядом столбцы, которые, как правило, обновляются одновременно.
* Селко Д. Стиль программирования Джо Селко на SQL. — М.: Изд-во «Русская редакция»; СПб.: Питер, 2006
У меня есть таблица SQL Server в производстве, которая имеет миллионы строк, и оказывается, что мне нужно добавить к ней столбец. Или, если быть более точным, мне нужно добавить поле к сущности, которую представляет таблица.
Синтаксически это не проблема, и если в таблице не было так много строк и не было в производстве, это было бы легко.
На самом деле то, что мне нужно, — это курс действий. Существует множество веб-сайтов с чрезвычайно большими таблицами, и они должны время от времени добавлять поля. Как они делают это без существенного простоя?
Одна вещь, которую я должен добавить, я не хотел, чтобы столбец разрешал null, что означало бы, что мне нужно иметь значение по умолчанию.
Поэтому мне нужно выяснить, как добавить столбец со значением по умолчанию вовремя, или мне нужно выяснить способ обновления столбца позднее, а затем установить, что столбец не разрешает значения null.
не займет много времени . Что займет много времени, так это вставить столбцы в середине других столбцов . b/c, тогда движок должен создать новую таблицу и скопировать данные в новую таблицу.
Единственное реальное решение для непрерывного времени бесперебойной работы — это резервирование .
Я признаю ответ @ Nestor, что добавление нового столбца не должно занять много времени в SQL Server, но, тем не менее, это все равно может быть отключением, которое неприемлемо для производственной системы. Альтернативой является изменение в параллельной системе, а затем, как только операция будет завершена, замените новое на старое.
Например, если вам нужно добавить столбец, вы можете создать копию таблицы, затем добавить столбец в эту копию, а затем использовать sp_rename () , чтобы переместить старый стол в сторону и новую таблицу на место.
Если у вас есть ссылочные ограничения целостности, указывающие на эту таблицу, это может сделать обмен еще более сложным. Вероятно, вам придется кратко отказаться от ограничений при обмене таблицами.
Для некоторых видов сложных обновлений вы можете полностью дублировать базу данных на отдельном сервере. Как только это будет готово, просто замените записи DNS для двух серверов и voilà!
Я поддержал биржевую компанию в 1990-х годах, которые управляли тремя дубликатами серверов баз данных. Что чтобы они могли внедрять обновления на один сервер, сохраняя один производственный сервер и один переход на другой ресурс сервер. Их операции имели стандартная процедура вращения три машины через производство, отказоустойчивости и обслуживания каждый день . Когда им необходимо обновить оборудования, программного обеспечения или изменить схемы базы данных, потребовалось три дня распространять изменения через их серверов, но они могли бы это сделать без прерывание обслуживания. Все спасибо к избыточности.
«Добавьте столбец, а затем выполните относительно небольшие пакеты UPDATE, чтобы заполнить столбец значением по умолчанию. Это должно предотвратить любые заметные замедления»
И после этого вы должны установить столбец NOT NULL, который будет срабатывать в одной большой транзакции. Так что все будет работать очень быстро, пока вы это не сделаете, поэтому вы, вероятно, очень мало на самом деле получили. Я знаю это только из первых рук.
Возможно, вы захотите переименовать текущую таблицу с X на Y. Вы можете сделать это с помощью этой команды sp_RENAME ‘[OldTableName]’, ‘[NewTableName]’.
Повторно создайте новую таблицу как X с новым столбцом, установленным в NOT NULL, а затем вставьте пакет из Y в X и включите значение по умолчанию либо в свою вставку для нового столбца, либо поместите значение по умолчанию в новый столбец при воссоздании таблицы X.
Я сделал этот тип изменений на столе с сотнями миллионов строк. Это продолжалось более часа, но это не привело к взрыву нашего журнала. Когда я попытался просто изменить столбец на NOT NULL со всеми данными в таблице, потребовалось более 20 часов, прежде чем я убил процесс.
Пробовали ли вы просто добавить столбец, заполняющий его данными, и установив столбец NOT NULL?
Поэтому, в конце концов, я не думаю, что есть волшебная пуля.
Я не хотел, чтобы столбец разрешал null, что означало бы, что мне нужно иметь значение по умолчанию.
Добавление столбца NOT NULL с DEFAULT Ограничение на таблицу из любого количества строк (даже миллиардов) стало легче много , начиная с SQL Server 2012 (но только для Enterprise Edition), поскольку они позволили ему работать в Интернете (в большинстве случаев), где для существующих строк значение будет считываться из метаданных и фактически не хранится в строке до тех пор, пока строка не будет обновлена, или кластеризованный индекс перестраивается. Вместо парафраза, вот соответствующий раздел на странице MSDN для ALTER TABLE :
Добавление NOT NULL столбцов в качестве онлайн-операции
Начиная с SQL Server 2012 Enterprise Edition добавление столбца NOT NULL со значением по умолчанию — это онлайн-операция, когда значением по умолчанию является константа времени . Это означает, что операция выполняется почти мгновенно, независимо от количества строк в таблице. Это связано с тем, что существующие строки в таблице не обновляются во время операции; вместо этого значение по умолчанию сохраняется только в метаданных таблицы, и значение просматривается по мере необходимости в запросах, которые обращаются к этим строкам. Такое поведение происходит автоматически; дополнительный синтаксис не требуется для реализации онлайн-операции за синтаксисом ADD COLUMN. Константа времени выполнения — это выражение, которое производит одно и то же значение во время выполнения для каждой строки таблицы независимо от ее детерминизма. Например, константное выражение «Мои временные данные» или системная функция GETUTCDATETIME () являются константами времени выполнения. Напротив, функции NEWID () или NEWSEQUENTIALID () не являются константами времени выполнения, поскольку для каждой строки таблицы создается уникальное значение. Добавление столбца NOT NULL со значением по умолчанию, который не является константой времени выполнения, всегда выполняется в автономном режиме, а эксклюзивная (SCH-M) блокировка выполняется на время операции.
В то время как существующие строки ссылаются на значение, хранящееся в метаданных, значение по умолчанию сохраняется в строке для любых вставленных новых строк и не указывает другое значение для столбца. Значение по умолчанию, хранящееся в метаданных, перемещается в существующую строку при обновлении строки (даже если фактический столбец не указан в инструкции UPDATE), или если таблица или кластерный индекс перестраиваются.
Колонки типа varchar (max), nvarchar (max), varbinary (max), xml, text, ntext, image, hierarchyid, геометрия, география или CLR UDTS не могут быть добавлены в онлайн-операции. Столбец нельзя добавить в сеть, если это приводит к тому, что максимально возможный размер строки превышает предел в 8,060 байт. В этом случае столбец добавляется как автономная операция.
Для добавления столбцов используется предложение ADD :
Новый столбец становится последним столбцом:
Указания по добавлению столбца
Столбцы можно добавлять и изменять.
Отсутствует возможность указания места расположения столбца. Новый столбец всегда становится последним столбцом.
В примере на рисунке в таблицу DEPT80 добавляется столбец с именем JOB_ID . Столбец JOB_ID становится последним столбцом в таблице.
Примечание . Если при добавлении столбца таблица уже содержит строки, тогда новый столбец первоначально является пустым или принимает для всех строк стандартные значения. Обязательный столбец NOT NULL можно добавить в таблицу, которая содержит данные в других столбцах, только если заданы стандартные значения. В пустую таблицу столбец NOT NULL можно добавить без стандартного значения.
Небольшие доработки по сайту иногда требуют вставки новых столбцов в таблицу базы данных MySQL. Речь идет о столбце, который необходимо добавить в какую-либо таблицу базы данных посредством консоли. Давайте рассмотрим несколько примеров добавление столбцов. Для вставки новых столбцов в MySQL есть команда ALTER TABLE ADD, про использование которой я буду говорить далее.
Если у вас был опыт работы с SQL запросами, то наверняка вам не составит большого труда разобраться что тут и к чему.
Синтаксис:
Описание параметров использованных в запросе:
table_name — название таблицы;
field_name — название столбца;
parametrs — параметры поля;
В параметрах столбца обязательным является указание типа данных.
Попробуем вставить в таблицу t_posts столбец tags текстового типа.
Новый столбец tags будет добавлено по умолчанию в конец таблицы. Чтобы столбец оказался в начале таблицы необходимо добавить ещё один ключевой параметр — FIRST.
После выполнения команды в таблицу будет добавлен новый столбец в начало таблицы. Если нужно разместить столбец таблицы не в начале и не в конце, а после определенного столбца, то следует добавить параметр AFTER с указанием столбца после которого будет размещен новый столбец.
После выполнение команды в таблицу t_post будет добавлен столбец типа TEXT после столбца description.
Есть возможность вставлять сразу несколько столбцов, указав их через запятую.
Команда предполагает добавление столбцов tags, prevew_text, detail_text типа TEXT.
По аналогии с указанием размещения после других столбцов.
Столбец tags будет добавлен после столбца comments, а столбец preview_text будет добавлен после столбца views.
Правила для изменения и модификации описания столбцов
При корректировке
таблиц нельзя:
добавлять новый
столбец с опцией NOT NULL.добавлять к
столбцу опцию NOT NULL, если в нем есть
пустые значенияуменьшить размер
поля или изменить его тип, если в нем
содержатся какие-либо данные.Удалить столбец
из таблицы, если на этот столбец были
установлены какие-либо ограничения
кроме NOT NULL| NULL
Добавление столбца
Синтаксис команды:
ALTER TABLE <имя
таблицы>
ADD
<имя столбца> <тип данных> <ширина
столбца>
[DEFAULT
<значение>] [,…n];
где
DEFAULT
– определяет значение столбца по
умолчанию.
При добавлении
столбца он автоматически становится
последним в таблице. Изменить положение
столбца в таблице не представляется
возможным.
Пример 31
Задача.
Добавить
столбец YearBegin
(год начала учебы в институте) в таблицу
Student, задав тип данных Datetime.
Решение.
ALTER TABLE Student
ADD
YearBegin
Datetime;
Пример 32
Задача.
Добавить
столбец IDFacultet
(Код факультета) в таблицу SGroup,
задав тип данных INT
и определив значение по умолчанию 1.
Решение.
ALTER
TABLE
SGroup
ADD
IDFacultet
INT
Default
1;
Сразу
обратим внимание, что DEFAULT
реализовано в SQL
Server
2000 как ограничение и поэтому при
дальнейшей попытке удалить этот столбец,
необходимо будет сначала удалить
ограничение, а затем уже удалить столбец.
При
добавлении нового столбца с ограничение
NOT NULL в таблицу следует руководствоваться
ниже перечисленными правилами.
Если
в таблице уже есть данные, то добавление
столбца осуществляется или в 3 этапа
(см. Пример 34):
Или
в один этап, но, задав ему значение по
умолчанию или определив его как столбец
IDENTITY.
Если
в таблице нет данных, то добавление
столбца осуществляется в 2 этапа:
Пример 33
Задача.
Добавить
в таблицу SGroup,
содержащую данные, столбец IDFacultet,
установив для него ограничение NOT
NULL.
Решение.
ALTER TABLE SGroup
ADD IDFacultet INT NOT NULL
Default
1;
Пример 34
Задача.
Добавить
в таблицу SGroup,
содержащую данные, столбец IDFacultet,
установив для него ограничение NOT
NULL.
Решение.
Добавляем
столбец:
ALTER
TABLE
SGroup
ADD IDFacultet INT;
Заполняем
столбец
IDFacultet:
UPDATE SGroup SET
IDFacultet=1
Назначаем
ограничение
NOT NULL:
ALTER TABLE SGroup
ALTER
COLUMN IDFacultet INT NOT NULL
Модификация столбца
Синтаксис команды:
ALTER TABLE <имя
таблицы>
ALTER
COLUMN
<имя столбца> <новый тип данных>
<длина>
[DEFAULT
<значение>]
[NULL|NOT
NULL]
[,…n];
SQL
Server
не разрешает изменять столбцы типа
text,
ntext,
image,
rowversion,
вычисляемые столбцы, столбцы, используемые
в репликации, и столбцы, на которые
имеются ссылки в выражениях вычисляемых
столбцов или ограничений. Нельзя удалить
или изменить столбец, имеющий значение
по умолчанию (ограничение DEFAULT).
Однако можно увеличить размер столбцов
переменой длины, которые используются
в индексах, в ограничениях CHECK
или UNIQUE.
Пример 35
Задача.
Увеличить
ширину столбца NameGroup,
увеличив ее до 20 символов.
Решение.
ALTER TABLE SGroup
ALTER
COLUMN NameGroup VARCHAR(20)
The command(s) completed successfully.
Однако
если теперь сделать попытку вернуться
к предыдущему размеру столбца, то она
будет неудачной, поскольку столбец
имеет ограничение UNIQUE.
Пример 36
Задача.
Уменьшить
размер столбца NameGroup
до 15 символов (предполагается, что ранее
она была увеличена до 20 символов).
Решение.
ALTER TABLE SGroup
ALTER COLUMN NameGroup
VARCHAR(15)
На этот раз будет
диагностирована ошибка.
Server: Msg
5074, The object ‘SgroupNameGroupUnique’ is dependent on column
‘NameGroup’.
Server: Msg
4922, ALTER TABLE ALTER COLUMN NameGroup failed because one or more
objects access this column.
Если столбец
все-таки необходимо изменить, то сначала
следует удалить ограничение
SgroupNameGroupUnique,
ALTER
TABLE SGroup
DROP CONSTRAINT
SgroupNameGroupUnique
Затем
уменьшить
ширину
столбца.
ALTER TABLE SGroup
ALTER
COLUMN NameGroup VARCHAR(15)
(2
row(s) affected)
Задание 10
Добавить
в таблицу Student столбец Single, тип данных
VARCHAR(3), назначив значение по умолчанию
“Да”. Удалить столбец.
Задание 11
Добавить
в таблицу Student столбец AVGMark,
тип Numeric
(5,2). В столбце будет храниться средняя
оценка студента. Мы оставим этот столбец
в базе данных лишь для того, чтобы в
дальнейшем продемонстрировать с помощью
него работу некоторых команд и процедур,
написание которых как раз и будет
обусловлено наличием этого избыточного
столбца. Отсюда вывод — такие столбцы,
содержащие расчетные данные, полученные
на основании уже хранящихся в таблице
данных, не следует включать в таблицы.
Задание 12
Изменить
длины полей в соответствии с таблицей
(см. Таблица 11). Выполнить анализ — почему
не удалось выполнить заданные операции
с некоторыми столбцами? Что необходимо
предпринять, чтобы эти изменения всё
же произвести?
Таблица 11
Имя | Тип | Размер | Ограничения |
IDReport | Varchar | 4 | |
NameWork | Varchar | 4 | |
NameSubject | Varchar | 4 | |
DateHire | Smalldatetime | ||
Mark | Numeric | 2 | NULL |
DeptName | Varchar | 4 | NULL |
NRecordBook | Varchar | 6 | |
NTerm | Numeric | 2 | |
NameReport | Varchar | 35 | |
NameSubject | Varchar | 35 | |
PIN | Varchar | 4 | |
TeachPost | Varchar | 25 | NULL |
Clock | Numeric | 5. 2 | |
StName | Varchar | 35 | |
TeachName | Varchar | 35 |
Как добавить несколько столбцов в SQL?
Как разработчик базы данных, вам необходимо добавить столбцы в существующую таблицу. Добавление столбца с помощью SQL Server Management Studio может быть осуществимо для небольших таблиц, но когда дело доходит до больших таблиц, вам понадобится более простой способ изменить и добавить несколько столбцов SQL.
Вы можете добавить несколько столбцов в SQL различными способами. Например, чтобы добавить несколько столбцов в SQL, вы можете использовать инструкцию ALTER TABLE ADD в SQL. Этот оператор также можно использовать для изменения столбца, удаления столбца или переименования столбца. Существуют разные способы добавления нескольких столбцов в SQL. Существуют разные системы баз данных и множество способов добавления нескольких столбцов SQL, которые вы изучите в этой статье.
После создания таблицы может случиться так, что вы забыли добавить в таблицу важный столбец, который вам нужен. В этой ситуации вы можете использовать оператор ALTER TABLE ADD, чтобы добавить несколько столбцов в SQL. Чтобы добавить несколько столбцов SQL, укажите несколько столбцов для добавления после ключевого слова ADD и разделите каждый столбец, который вы хотите добавить, запятой.
В этой статье вы узнаете, как добавить несколько столбцов SQL с помощью инструкции ALTER TABLE. Вы также можете изменить или удалить определенные столбцы с помощью инструкции ALTER TABLE.
Давайте рассмотрим синтаксис оператора ALTER TABLE и посмотрим, как его можно использовать для добавления нескольких столбцов в SQL.
Приведенный выше синтаксис используется для добавления столбца в таблицу, и вы также можете добавить несколько столбцов в SQL с помощью оператора ALTER TABLE, синтаксис которого обсуждается в этой статье.
Теперь давайте посмотрим, как оператор ALTER TABLE можно использовать для добавления нового столбца в SQL.
Как показано в приведенном выше запросе, оператор ALTER TABLE ADD используется для добавления нового столбца, т. е. prdct_description, в таблицу Products.
Создание таблицы
Давайте создадим таблицу Продажи . Приведенный ниже запрос используется для создания таблицы Sales .
Вывод приведенного выше SQL-запроса показан ниже:
Теперь, если вы хотите добавить новый столбец в таблицу, вы можете использовать оператор ALTER TABLE ADD COLUMN. Используя этот оператор, вы можете добавить столько столбцов, сколько хотите, в уже созданную таблицу. Чтобы добавить новый столбец с именем prdct_sales, используется приведенный ниже оператор alter table.
Теперь, после выполнения приведенного выше SQL-запроса, результат будет выглядеть следующим образом:
Вывод:
Как видно из приведенного выше результата, новый столбец, то есть prdct_sales, добавлен в таблицу Sales. Значения для вновь добавленного столбца не предоставляются, поэтому в результате отображается NULL .
Добавить несколько столбцов в SQL
Вы можете добавить несколько столбцов в таблицу в SQL с помощью инструкции ALTER TABLE.
Синтаксис для добавления нескольких столбцов SQL приведен ниже:
Как показано в приведенном выше синтаксисе, вы также можете добавить несколько столбцов SQL с помощью инструкции ALTER TABLE. Как указано выше, вы можете добавить несколько столбцов SQL с помощью ключевого слова ADD и отделить каждый столбец запятой. В приведенном выше примере к таблице table_name добавляется n столбцов, т. е. столбец1, столбец2 и т. д.
Давайте рассмотрим пример, чтобы увидеть, как можно добавить несколько столбцов SQL с помощью инструкции ALTER TABLE.
Предложение SQL ADD COLUMN с примерами
Вы также можете использовать предложение ADD COLUMN для добавления столбцов в таблицу в SQL.
Синтаксис предложения ADD COLUMN приведен ниже и объяснен с примерами.
Синтаксис:
Пример:
Давайте создадим таблицу с именем Учителя. Приведенный ниже запрос используется для создания таблицы.
Теперь, если вы хотите добавить новые столбцы, например, сборы, адрес и учетная запись учителя, вы можете использовать следующий запрос:
Таким образом, оператор ALTER TABLE ADD COLUMN можно использовать для добавления одного или нескольких столбцов в таблицы в SQL.
В этом разделе вы узнаете о различных способах использования оператора SQL ADD COLUMN в соответствии с различными существующими системами баз данных.
1. PostgreSQL
Добавление одного столбца в существующую таблицу в PostgreSQL:
Добавление нескольких столбцов в существующую таблицу в PostgreSQL:
2. MySQL
Добавление один столбец в существующую таблицу в MySQL:
Добавление нескольких столбцов в существующую таблицу в MySQL:
3. Oracle
Добавление одного столбца в существующую таблицу в Oracle:
Добавление нескольких столбцов в существующую таблицу в Oracle:
4. SQL Server
Добавление одного столбца в существующую таблицу в SQL Сервер:
Добавление нескольких столбцов в существующую таблицу в SQL Server:
5. SQLite
Добавление одного столбца в существующую таблицу в SQL Server:
Добавление нескольких столбцов в существующую таблицу в SQLite:
Вы не можете добавить несколько столбцов в существующую таблицу, используя сразу в SQLite, так как он не поддерживает добавление нескольких таблиц с помощью одного оператора. Вместо этого вы можете выполнить несколько операторов ALTER ADD COLUMN.
6. DB2
Добавление одного столбца в существующую таблицу в SQL Server:
Добавление нескольких столбцов в существующую таблицу в DB2:
Подробнее
- Учебник по SQL
- СОЕДИНИТЬ несколько таблиц в SQL
Заключение
- В этой статье вы узнали об операторе ALTER TABLE ADD COLUMN для добавления одного или нескольких столбцов в существующую таблицу.
- Чтобы добавить несколько столбцов SQL, укажите несколько столбцов для добавления после ключевого слова ADD и разделите каждый добавляемый столбец запятой.
- Вы также можете изменить или удалить определенные столбцы с помощью инструкции ALTER TABLE.
- Вы также можете использовать предложение ADD COLUMN для добавления столбцов в таблицу в SQL.
сервер sql — ALTER TABLE ADD COLUMN в пакетах, но с NEWSEQUENTIALID()
Коллега указал, как вы можете использовать ключевое слово DEFAULT в этом случае, хотя я не уверен на 100%, как оно работает, оно работает.
Используя приведенный выше пример, ниже показано, как это работает:
-- создать пример таблицы СОЗДАТЬ ТАБЛИЦУ #Тест ( Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, DateCreated DATETIME NOT NULL DEFAULT (GETDATE()), Код NVARCHAR(50) НЕ NULL ) ОБЪЯВИТЬ @Id INT ОБЪЯВИТЬ @NO_OF_CHARS ЦЕЛОЕ = 10 УСТАНОВИТЬ @Id = 1 ПОКА @Id <= 12000 НАЧИНАТЬ ВСТАВИТЬ В #Test (Code) VALUES (SUBSTRING (REPLACE(CONVERT(VARCHAR(40), NEWID()), '-',''), 1, @NO_OF_CHARS)) УСТАНОВИТЬ @Id = @Id + 1 КОНЕЦ -- добавить новый столбец со значением по умолчанию, но он по-прежнему допускает значение NULL ИЗМЕНИТЬ ТАБЛИЦУ #Test ADD InternalId UNIQUEIDENTIFIER NULL DEFAULT (NEWSEQUENTIALID()) ИДТИ DECLARE @MaxId INT, @LoopStart INT, @LoopEnd INT, @LoopSize INT = 50000 ВЫБЕРИТЕ @MaxId = MAX(Id) FROM #Test ВЫБЕРИТЕ @LoopStart = MIN(Id) ИЗ #Test SET @LoopEnd = @LoopStart + @LoopSize PRINT 'Обновление InternalIds до нового GUID' ПОКА @LoopStart <= @MaxId НАЧИНАТЬ -- обновить внутренний идентификатор, используя ПО УМОЛЧАНИЮ -- https://dba. stackexchange.com/questions/72604/adding-non-nullable-newsequentialid-column-to-existing-table ОБНОВЛЕНИЕ #Тест УСТАНОВИТЬ InternalId = ПО УМОЛЧАНИЮ ГДЕ Id МЕЖДУ @LoopStart И @LoopEnd УСТАНОВИТЬ @LoopStart = @LoopEnd + 1 УСТАНОВИТЬ @LoopEnd = @LoopEnd + @LoopSize КОНЕЦ -- теперь сделайте это не нулевым ALTER TABLE #Test ALTER COLUMN InternalId UNIQUEIDENTIFIER NOT NULL - сделать базовый тест ОБЪЯВИТЬ @First UNIQUEIDENTIFIER ВЫБЕРИТЕ * ИЗ # Тест ВЫБЕРИТЕ @First = InternalId FROM #Test WHERE Id = 1 SELECT * FROM #Test WHERE InternalId > @First УДАЛИТЬ ТАБЛИЦУ #Тест
Кроме того, этот SQL Fiddle показывает его в действии:
SQL Fiddle
Настройка схемы MS SQL Server 2017 :
CREATE TABLE Test ( Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, DateCreated DATETIME NOT NULL DEFAULT (GETDATE()), Код NVARCHAR(50) НЕ NULL )
Запрос 1 :
DECLARE @Id INT ОБЪЯВИТЬ @NO_OF_CHARS ЦЕЛОЕ = 10 УСТАНОВИТЬ @Id = 1 ПОКА @Id <= 10 НАЧИНАТЬ INSERT INTO Test (Code) VALUES (SUBSTRING (REPLACE(CONVERT(VARCHAR(40), NEWID()), '-',''), 1, @NO_OF_CHARS)) УСТАНОВИТЬ @Id = @Id + 1 КОНЕЦ -- добавить новый столбец со значением по умолчанию, но он по-прежнему допускает значение NULL ИЗМЕНИТЬ ТАБЛИЦУ Тест ADD InternalId UNIQUEIDENTIFIER NULL DEFAULT (NEWSEQUENTIALID())
Результаты :
Запрос 2 :
DECLARE @MaxId INT, @LoopStart INT, @LoopEnd INT, @LoopSize INT = 50000 ВЫБЕРИТЕ @MaxId = MAX(Id) ИЗ теста ВЫБЕРИТЕ @LoopStart = MIN (Id) ОТ теста SET @LoopEnd = @LoopStart + @LoopSize PRINT 'Обновление InternalIds до нового GUID' ПОКА @LoopStart <= @MaxId НАЧИНАТЬ -- обновить внутренний идентификатор, используя ПО УМОЛЧАНИЮ -- https://dba. stackexchange.com/questions/72604/adding-non-nullable-newsequentialid-column-to-existing-table ОБНОВЛЕНИЕ Тест УСТАНОВИТЬ InternalId = ПО УМОЛЧАНИЮ ГДЕ Id МЕЖДУ @LoopStart И @LoopEnd УСТАНОВИТЬ @LoopStart = @LoopEnd + 1 УСТАНОВИТЬ @LoopEnd = @LoopEnd + @LoopSize КОНЕЦ -- теперь сделайте это не нулевым ALTER TABLE Test ALTER COLUMN InternalId UNIQUEIDENTIFIER NOT NULL
Результаты :
Запрос 3 :
-- выполнить базовый тест ВЫБЕРИТЕ * ИЗ теста
Результаты :
| Идентификатор | Дата создания | код | Внутренний идентификатор | |-----|------------|-------------|--- -----------------------------------| | 191 | 2022-01-28T13:59:08.947Z | D61874FEB6 | BFC0423E-F36B-1410-80BF-800000000000 | | 192 | 2022-01-28T13:59:08.947Z | C596780C9F | C0C0423E-F36B-1410-80C0-800000000000 | | 193 | 2022-01-28T13:59:08.947Z | 3356A26232 | C1C0423E-F36B-1410-80C1-800000000000 | | 194 | 2022-01-28T13:59:08. 947Z | D6D509EDE7 | C2C0423E-F36B-1410-80C2-800000000000 | | 195 | 2022-01-28T13:59:08.947Z | E956CBCF4B | C3C0423E-F36B-1410-80C3-800000000000 | | 196 | 2022-01-28T13:59:08.947Z | E32EAB6E92 | C4C0423E-F36B-1410-80C4-800000000000 | | 197 | 2022-01-28T13:59:08.947Z | Б2137001АА | C5C0423E-F36B-1410-80C5-800000000000 | | 198 | 2022-01-28T13:59:08.947Z | 0FB26856C9 | C6C0423E-F36B-1410-80C6-800000000000 | | 199 | 2022-01-28T13:59:08.947Z | 5DFCD86CAC | C7C0423E-F36B-1410-80C7-800000000000 | | 200 | 2022-01-28T13:59:08.947Z | C4BFCDC59 | C8C0423E-F36B-1410-80C8-800000000000 |
Запрос 4 :
-- проверка водяного знака DECLARE @First UNIQUEIDENTIFIER = (ВЫБЕРИТЕ 1 TOP 1 InternalId FROM Test ORDER BY Id ASC) --SELECT 'Водяной знак: ' AS [Примечание], @First AS [WatermarkId] SELECT * FROM Test WHERE InternalId > @First
Результаты :
| Идентификатор | Дата создания | код | Внутренний идентификатор |
|-----|------------|-------------|--- -----------------------------------|
| 192 | 2022-01-28T13:59:08.